/ Hex Artifact Content
Login

Artifact df0c87b2d55772d55de8158fb43d107d2f7a98a9:


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 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1610: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1620: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1630: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1640: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1650: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1670: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
1680: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1690: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
16a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
16c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
16d0: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16f0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1700: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1710: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1720: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1730: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1740: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1750: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1760: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1770: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1780: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1790: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
17a0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
17b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
17c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
17d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
17e0: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
17f0: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1800: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1810: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1820: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1830: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1840: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1850: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1880: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
1890: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
18c0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
18d0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
18e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
18f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1900: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1910: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1920: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1930: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1940: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1950: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1960: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
1970: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
1980: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1990: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
19a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
19b0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
19c0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
19d0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
19e0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
19f0: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1a00: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e  st entry */.  un
1a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1a30: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1a40: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1a50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1a90: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  tor */.  int dir
1aa0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1ad0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1ae0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1af0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1b20: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1b30: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
1b40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1b60: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
1b70: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1b80: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1b90: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1bb0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1bc0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1bd0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1be0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1bf0: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1c00: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1c10: 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73  .  int fileFlags
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1c40: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1c60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1c70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1c90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1cc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1cd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 53  rmation */.#if S
1ce0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cf0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
1d00: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70   /* The flags sp
1d30: 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28  ecified at open(
1d40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1d50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d60: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
1d70: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d80: 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46  ).  unsigned fsF
1d90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1da0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65          /* cache
1db0: 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73  d details from s
1dc0: 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69  tatfs() */.#endi
1dd0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1de0: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1e10: 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
1e20: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  e */.  struct vx
1e30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1e50: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1e60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
1e70: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e80: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e90: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1ea0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1eb0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1ec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ed0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ee0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1ef0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1f00: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1f10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1f20: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1f30: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1f40: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1f50: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1f60: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f70: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f90: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1fa0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1fb0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1fc0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1fd0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1fe0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1ff0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2000: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2010: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2040: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2060: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2070: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2080: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2090: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
20a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20b0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
20c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
20d0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
20e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
20f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2100: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2110: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2120: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2130: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2140: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2150: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2160: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2170: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2180: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2190: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
21a0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
21b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
21c0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69  wing macros defi
21d0: 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46  ne bits in unixF
21e0: 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f  ile.fileFlags.*/
21f0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2200: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
2210: 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20  NG  0x0001   /* 
2220: 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c  Use whole-file l
2230: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2240: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2250: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2260: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2270: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
2280: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
2290: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
22a0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
22b0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
22c0: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
22d0: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
22e0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
22f0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2310: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2320: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2330: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2340: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2350: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2360: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2370: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
2380: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
2390: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
23c0: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
23d0: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
23e0: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
23f0: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2400: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2410: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2420: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2430: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2440: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2450: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
2460: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
2470: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
2480: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
2490: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
24a0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
24b0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
24c0: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
24d0: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
24e0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24f0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2500: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2510: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
2520: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2530: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2540: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2550: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2560: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2570: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2580: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2590: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  adid 0.#endif...
25a0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
25b0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
25c0: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
25d0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
25e0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
25f0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
2600: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
2610: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
2620: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2630: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2640: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2650: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2660: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2670: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
2680: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
2690: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
26a0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
26b0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
26c0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
26d0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
26e0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
26f0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2700: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2710: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2720: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2730: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2740: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2750: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2760: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2770: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
2780: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
2790: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
27a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
27b0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
27c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
27d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
27e0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
27f0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2860: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2870: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
2880: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
2890: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
28b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
28c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
28d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
28e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28f0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2900: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2910: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2920: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2930: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2940: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2950: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2960: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2970: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
2980: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
2990: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29a0: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
29b0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
29c0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
29d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
29e0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
29f0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2a00: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2a10: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2a20: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2a30: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2a40: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2a50: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2a60: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2a70: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
2a80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
2a90: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
2aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
2ab0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
2ac0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
2ad0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2ae0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2af0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2b00: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2b10: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2b20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2b30: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2b40: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2b50: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2b60: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2b70: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2b80: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2b90: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ba0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2bb0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2bc0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2bd0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2be0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2bf0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2c00: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2c10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2c20: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2c30: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2c40: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2c50: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2c60: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2c70: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2c80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c90: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2ca0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2cb0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2cc0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2cd0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2cf0: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2d00: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2d10: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2d20: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2d30: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2d40: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2d50: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2d60: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2d70: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2d80: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2da0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2db0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2dc0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2dd0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2df0: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2e00: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2e10: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2e20: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2e30: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2e40: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2e50: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2e60: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2e70: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2e80: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2e90: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2ea0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2eb0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2ec0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2ed0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2ee0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2ef0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2f00: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2f10: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2f20: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2f30: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2f40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2f50: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2f60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2f70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2f80: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2f90: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2fa0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2fb0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2fc0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fd0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2fe0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2ff0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
3000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3010: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3020: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3040: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
3050: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
3060: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
3070: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
3080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
3090: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
30a0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
30b0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
30c0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
30d0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
30e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30f0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3100: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3110: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3120: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3130: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3140: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3150: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3160: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3170: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
3180: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
3190: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
31a0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
31b0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
31c0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
31d0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
31e0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
31f0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3200: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3210: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3220: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3230: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3240: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3250: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3260: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3270: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
3280: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
3290: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
32a0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
32b0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
32c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
32d0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
32e0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
32f0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3300: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3310: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3320: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3340: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3350: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3360: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3370: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
3380: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
3390: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
33a0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
33b0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
33c0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
33d0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
33e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
33f0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3400: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3410: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3420: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3430: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3440: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3450: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3460: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3470: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
3480: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
3490: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
34a0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
34b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
34c0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
34d0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
34e0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
34f0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3510: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3520: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3530: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3540: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3560: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3570: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
3580: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
3590: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
35a0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
35b0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
35c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
35d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
35e0: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
35f0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3600: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3610: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3620: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3630: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3640: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3650: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3660: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3670: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
3680: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
3690: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
36a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
36b0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
36c0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
36d0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
36e0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
36f0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3700: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3710: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3720: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3730: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3740: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3750: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3760: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3770: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
3780: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
3790: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
37a0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
37b0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
37c0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
37d0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
37e0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
37f0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3800: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3810: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3820: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3830: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3840: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
38a0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
38b0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
38c0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
38d0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
38e0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
38f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3900: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3910: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3920: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3930: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3940: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3950: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3960: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3970: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
3980: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
3990: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
39a0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
39b0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
39c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
39d0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
39e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
39f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3a00: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3a10: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3a20: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3a30: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3a40: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3a50: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3a60: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3a80: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
3a90: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
3aa0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
3ab0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
3ac0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
3ad0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3ae0: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3af0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3b00: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3b10: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3b20: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3b30: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3b40: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3b50: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3b60: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3b70: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3b80: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3b90: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ba0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3bb0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3bc0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3bd0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3be0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3bf0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3c00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c30: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3c40: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3c50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3c70: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3c80: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3c90: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3ca0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3cb0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3cc0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3cd0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3ce0: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3cf0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3d00: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3d10: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3d20: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3d30: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3d50: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3d60: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3d70: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3d80: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3d90: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3da0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3db0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3dc0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3dd0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3de0: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3df0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3e00: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3e10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3e20: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3e30: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3e40: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3e50: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3e60: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3e70: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3e80: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3e90: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3ea0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3eb0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3ec0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3ed0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3ee0: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3f00: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3f10: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3f20: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3f30: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3f40: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3f50: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3f60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3f70: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3f80: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3f90: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3fa0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3fb0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3fc0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3fd0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3fe0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3ff0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
4000: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
4010: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
4020: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
4030: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
4040: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
4050: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
4060: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
4070: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
4080: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
4090: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
40b0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
40c0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
40d0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
40e0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
40f0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4100: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4110: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4120: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4140: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4150: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4160: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4170: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
4180: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
4190: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
41a0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
41b0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
41c0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
41d0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
41e0: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
41f0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4200: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4210: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4220: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4230: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4240: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4250: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4260: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4270: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
4280: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
4290: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
42a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
42b0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
42c0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
42d0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
42e0: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
42f0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4300: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4310: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4320: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4330: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4340: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4350: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4380: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
4390: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
43a0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
43b0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
43c0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
43d0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
43e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
43f0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4400: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4410: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4420: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4430: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4440: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4450: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4460: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4470: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
4480: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
4490: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
44a0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
44b0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
44c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
44d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
44e0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
44f0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4500: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4510: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4520: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4530: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4540: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4550: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4560: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4570: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
4580: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
4590: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
45a0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
45b0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
45c0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
45d0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
45e0: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
45f0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4600: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4610: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4620: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4630: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4640: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4650: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4660: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4670: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
4680: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
4690: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
46b0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
46c0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
46d0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
46e0: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
46f0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4700: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4710: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4720: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4730: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4740: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4750: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4760: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4770: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4780: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
4790: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
47a0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
47b0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
47c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
47d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
47e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
47f0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4800: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4810: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4820: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4830: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4840: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4850: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4860: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4870: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
4880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
4890: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
48a0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
48b0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
48c0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
48d0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
48e0: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
48f0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4900: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4910: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4920: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4930: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4940: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4950: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4960: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4970: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
4980: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
49f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4a60: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4a70: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
4aa0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
4ab0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
4ac0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
4ad0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4ae0: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4af0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4b00: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4b10: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4b20: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4b30: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4b40: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4b50: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4b60: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4b70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4b80: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4b90: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ba0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4bb0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4bc0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4bd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4be0: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4bf0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4c00: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4c10: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4c20: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4c30: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4c40: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4c50: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4c60: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4c70: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4c80: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4c90: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4ca0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4cb0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4cc0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4cd0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4ce0: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4cf0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4d00: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4d10: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4d20: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4d30: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4d40: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4d50: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4d60: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4d70: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4d80: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4d90: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4da0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4db0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4dc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4dd0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4de0: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4df0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4e00: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4e10: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4e20: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4e30: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4e40: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4e50: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4e60: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4e70: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4e80: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4e90: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4ea0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4eb0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4ec0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4ed0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4ee0: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4ef0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4f00: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4f10: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4f20: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4f40: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4f50: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4f60: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4f70: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4f80: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4f90: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4fa0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4fb0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4fc0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4fd0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4fe0: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4ff0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
5000: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
5010: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
5020: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
5030: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
5040: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
5050: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
5060: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
5070: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
5080: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
5090: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
50a0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
50b0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
50c0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
50d0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
50e0: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
50f0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5100: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5110: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5120: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5130: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5140: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5150: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5160: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5170: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
5180: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
5190: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
51a0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
51b0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
51c0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
51d0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
51e0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
51f0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5200: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5210: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5220: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5230: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5240: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5250: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5260: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5270: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
5280: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
5290: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
52a0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
52b0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
52c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
52d0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
52e0: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
52f0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5300: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5310: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5320: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5330: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5340: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5350: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5360: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5370: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
5380: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
5390: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
53a0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
53b0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
53c0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
53d0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
53e0: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
53f0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5400: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5410: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5420: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5430: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5440: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5450: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5460: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5470: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
5480: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
5490: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
54a0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
54b0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
54c0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
54d0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
54e0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
54f0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5500: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5510: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5520: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5530: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5540: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5550: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5560: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5570: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
5580: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
5590: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
55a0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
55b0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
55c0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
55d0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
55e0: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
55f0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5600: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5610: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5620: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5630: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5640: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5650: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5660: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5670: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
5680: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
5690: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
56a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
56b0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
56c0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
56d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
56e0: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
56f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5700: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5710: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
5720: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
5730: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
5740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
5750: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
5760: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
5770: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
5780: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
5790: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
57a0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
57b0: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
57c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
57d0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
57e0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
57f0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5800: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5810: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5820: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5830: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5840: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
5850: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
5860: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
5870: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
5880: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
5890: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
58a0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
58b0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
58c0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
58d0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
58e0: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
58f0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5900: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5910: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5920: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5930: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5940: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5950: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
5960: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
5970: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
5980: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
5990: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
59a0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
59b0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
59c0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
59d0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
59e0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
59f0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5a00: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5a10: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5a20: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5a30: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5a40: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5a50: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
5a60: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
5a70: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
5a80: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
5a90: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
5aa0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
5ab0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5ac0: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5ad0: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5ae0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5af0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5b00: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5b10: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5b20: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5b30: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5b40: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5b50: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
5b60: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
5b70: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
5b80: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
5b90: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
5ba0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
5bb0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5bc0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5bd0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5be0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
5bf0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
5c00: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
5c10: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
5c20: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
5c30: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
5c40: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
5c50: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
5c60: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
5c70: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
5c80: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
5c90: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
5ca0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
5cb0: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
5cc0: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
5cd0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
5ce0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
5cf0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
5d00: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
5d10: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
5d20: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
5d30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
5d40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5d50: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
5d60: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
5d70: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
5d80: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
5d90: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
5da0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
5db0: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
5dc0: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
5dd0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
5de0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
5df0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
5e00: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5e10: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
5e20: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
5e30: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
5e40: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e60: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
5e70: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5e80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5e90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5ea0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
5eb0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
5ec0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
5ed0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
5ee0: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
5ef0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
5f00: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
5f10: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
5f20: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
5f30: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
5f40: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
5f50: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
5f60: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
5f70: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
5f80: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
5fa0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
5fb0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
5fc0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
5fd0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
5fe0: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
5ff0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
6010: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
6020: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6030: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
6040: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
6050: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6080: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
6090: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 46 69 6c 65  d */.  int eFile
60a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
60b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
60c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
60d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
60e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6110: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
6120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
6130: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
6140: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
6150: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
6160: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6170: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
6180: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
61c0: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
61d0: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
61e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
61f0: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
6200: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
6210: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6220: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6230: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6240: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
6250: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
6260: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6270: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
6280: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
6290: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
62a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62b0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
62c0: 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  YLE).  unsigned 
62d0: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
62e0: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
62f0: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
6300: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
6310: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
6320: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
6350: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
6360: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
6370: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
6380: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
6390: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
63a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
63b0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
63c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
63d0: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
63e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
63f0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
6400: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
6410: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
6420: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
6430: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
6440: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
6450: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
6460: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
6470: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6480: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
6490: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
64a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
64b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
64c0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
64d0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 49 6e 6f  nodeInfo(unixIno
64e0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 29 7b  deInfo *pInode){
64f0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
6500: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
6510: 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
6520: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
6530: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
6540: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
6550: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
6560: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
6570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
6580: 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  de->pPrev ){.   
6590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
65a0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
65b0: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
65c0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72       pInode->pPr
65d0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f  ev->pNext = pIno
65e0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
65f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6600: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
6610: 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  t==pInode );.   
6620: 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d       inodeList =
6630: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
6640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6650: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20  ( pInode->pNext 
6660: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6670: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  t( pInode->pNext
6680: 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20  ->pPrev==pInode 
6690: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
66a0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  e->pNext->pPrev 
66b0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b  = pInode->pPrev;
66c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
66d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f  qlite3_free(pIno
66e0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  de);.    }.  }.}
66f0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
6700: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
6710: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
6720: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
6730: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
6740: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
6750: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
6760: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
6770: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
6780: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
6790: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
67a0: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
67b0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
67c0: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
67d0: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
67e0: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
67f0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
6800: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
6810: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6820: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
6830: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
6840: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
6850: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f  atic int findIno
6860: 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69  deInfo(.  unixFi
6870: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
6880: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78           /* Unix
6890: 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20   file with file 
68a0: 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65  desc used in the
68b0: 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e   key */.  unixIn
68c0: 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64  odeInfo **ppInod
68d0: 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  e        /* Retu
68e0: 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  rn the unixInode
68f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65  Info object here
6900: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
6930: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
6940: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
6970: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
6980: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
6990: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
69a0: 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c  ileId;      /* L
69b0: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
69c0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
69d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
69e0: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
69f0: 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
6a00: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
6a10: 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  n */.  unixInode
6a20: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30  Info *pInode = 0
6a30: 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61  ;     /* Candida
6a40: 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  te unixInodeInfo
6a50: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73   object */..  as
6a60: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
6a70: 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47  eld() );..  /* G
6a80: 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66  et low-level inf
6a90: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
6aa0: 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20  he file that we 
6ab0: 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a  can used to.  **
6ac0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
6ad0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69   name for the fi
6ae0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20  le..  */.  fd = 
6af0: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d  pFile->h;.  rc =
6b00: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
6b10: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
6b20: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
6b30: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
6b40: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
6b50: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
6b60: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
6b70: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
6b80: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
6b90: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
6ba0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
6bb0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
6bc0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
6bd0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
6be0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
6bf0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
6c00: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
6c10: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
6c20: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
6c30: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
6c40: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
6c50: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
6c60: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
6c70: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
6c80: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
6c90: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
6ca0: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
6cb0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
6cc0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
6cd0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
6ce0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
6cf0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
6d00: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
6d10: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
6d20: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
6d30: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
6d40: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
6d50: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
6d60: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
6d70: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
6d80: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
6d90: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
6da0: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
6db0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
6dc0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
6dd0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
6de0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
6df0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
6e00: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
6e10: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
6e20: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
6e30: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
6e40: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
6e50: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
6e60: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
6e70: 20 20 72 63 20 3d 20 77 72 69 74 65 28 66 64 2c    rc = write(fd,
6e80: 20 22 53 22 2c 20 31 29 3b 0a 20 20 20 20 69 66   "S", 1);.    if
6e90: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
6ea0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6eb0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6ed0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
6ee0: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
6ef0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
6f00: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
6f10: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
6f20: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
6f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
6f40: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
6f50: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
6f60: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
6f70: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
6f80: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
6f90: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
6fa0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
6fb0: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
6fc0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
6fd0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
6fe0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
6ff0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
7000: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
7010: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
7020: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
7030: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
7040: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
7050: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
7060: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
7070: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
7080: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
7090: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
70a0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
70b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
70c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
70d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
70e0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
70f0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
7100: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
7110: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
7120: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
7130: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
7140: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
7150: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
7160: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
7170: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
7180: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
7190: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
71a0: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
71b0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
71c0: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
71d0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
71e0: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
71f0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
7200: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
7210: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7220: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
7230: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
7240: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
7250: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
7260: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
7270: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
7280: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
7290: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
72a0: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
72b0: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
72c0: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
72d0: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
72e0: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
72f0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
7300: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
7310: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
7320: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
7330: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
7340: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
7350: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
7360: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
7370: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
7380: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
7390: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
73a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
73b0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
73c0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
73d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
73e0: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
73f0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
7400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
7410: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
7420: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
7430: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
7440: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
7450: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
7460: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
7470: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
7480: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
7490: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
74a0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
74b0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
74c0: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
74d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
74e0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
74f0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
7500: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
7510: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
7520: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
7530: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
7540: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
7550: 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
7560: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
7570: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
7580: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
7590: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
75a0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
75b0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
75c0: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
75d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
75e0: 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20  LCK;.    if (-1 
75f0: 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  == fcntl(pFile->
7600: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
7610: 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  k)) {.      int 
7620: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
7630: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7640: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
7650: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
7660: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
7670: 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
7680: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
7690: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
76a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
76b0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
76c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
76d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
76e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
76f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7700: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
7710: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
7720: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
7730: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
7740: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
7750: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
7760: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7770: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
7780: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
7790: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
77a0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
77b0: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
77c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
77d0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
77e0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
77f0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
7800: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
7810: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
7820: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
7830: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
7840: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
7850: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
7860: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
7870: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
7880: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
7890: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
78a0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
78b0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
78c0: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
78d0: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
78e0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
78f0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
7900: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
7910: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
7920: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
7930: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
7940: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
7950: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
7960: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
7970: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
7980: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
7990: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
79a0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
79b0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
79c0: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
79d0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
79e0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
79f0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
7a00: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
7a10: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
7a20: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
7a30: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
7a40: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
7a50: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
7a60: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
7a70: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
7a80: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
7a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7aa0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
7ab0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
7ac0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
7ad0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
7ae0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
7af0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7b00: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
7b10: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
7b20: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
7b30: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
7b40: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
7b50: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
7b60: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
7b70: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
7b80: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
7b90: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
7ba0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
7bb0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
7bc0: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
7bd0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
7be0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
7bf0: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
7c00: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
7c10: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
7c20: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
7c30: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
7c40: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
7c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
7c60: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
7c70: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
7c80: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
7c90: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
7ca0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
7cb0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
7cc0: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
7cd0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
7ce0: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
7cf0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d00: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
7d10: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
7d20: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
7d30: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
7d40: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7d50: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
7d60: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
7d70: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
7d80: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
7d90: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
7da0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
7db0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
7dc0: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
7dd0: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
7de0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
7df0: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
7e00: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
7e10: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
7e20: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
7e30: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
7e40: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
7e50: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
7e60: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
7e70: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
7e80: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
7e90: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
7ea0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
7eb0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
7ec0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
7ed0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
7ee0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
7ef0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
7f00: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
7f10: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
7f20: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
7f30: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
7f40: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
7f50: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
7f60: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
7f70: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
7f80: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
7f90: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
7fa0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
7fb0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
7fc0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
7fd0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
7fe0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
7ff0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
8000: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
8010: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
8020: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
8030: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
8040: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
8050: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
8060: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
8070: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
8080: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
8090: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
80a0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
80b0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
80c0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
80d0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
80e0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
80f0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
8100: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
8110: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
8120: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
8130: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
8140: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
8150: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
8160: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
8170: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
8180: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
8190: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
81a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
81b0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
81c0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
81d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
81e0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
81f0: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
8200: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
8210: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
8220: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
8230: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
8240: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
8250: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
8260: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
8270: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
8280: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
8290: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
82a0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
82b0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
82c0: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
82d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
82e0: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
82f0: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
8300: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
8310: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8320: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
8330: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
8340: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
8350: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
8360: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75  ->pInode;.  stru
8370: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
8380: 20 69 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e   int s = 0;.  in
8390: 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
83a0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
83b0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
83c0: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
83d0: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
83e0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
83f0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
8400: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
8410: 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
8420: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
8430: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
8440: 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
8450: 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
8460: 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29  hared , getpid()
8470: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
8480: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
8490: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
84a0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
84b0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
84c0: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
84d0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
84e0: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
84f0: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
8500: 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
8510: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
8520: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
8530: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
8540: 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
8550: 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
8560: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
8570: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
8580: 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  ld) (unix)\n", p
8590: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
85a0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
85b0: 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
85c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
85d0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
85e0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
85f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
8600: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28  correct..  **  (
8610: 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
8620: 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
8630: 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
8640: 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
8650: 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
8660: 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
8670: 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
8680: 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
8690: 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
86a0: 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
86b0: 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
86c0: 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
86d0: 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
86e0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
86f0: 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
8700: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
8710: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
8720: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
8730: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
8740: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
8750: 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
8760: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
8770: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8780: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
8790: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
87a0: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
87b0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
87c0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
87d0: 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
87e0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
87f0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
8800: 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
8810: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
8820: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
8830: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
8840: 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
8850: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
8860: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
8870: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
8880: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
8890: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
88a0: 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
88b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
88c0: 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65           (pInode
88d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
88e0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
88f0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
8900: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
8910: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
8920: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8930: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
8940: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
8950: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
8960: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
8970: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
8980: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
8990: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
89a0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
89b0: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
89c0: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
89d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
89e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
89f0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
8a00: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
8a10: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8a20: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
8a30: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
8a40: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
8a50: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
8a60: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
8a70: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
8a80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
8a90: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
8aa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
8ab0: 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
8ac0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
8ad0: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
8ae0: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
8af0: 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
8b00: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
8b10: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8b20: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20  k;.  }...  /* A 
8b30: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
8b40: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
8b50: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
8b60: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
8b70: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
8b80: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
8b90: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
8ba0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
8bb0: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
8bc0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
8bd0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
8be0: 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  1L;.  lock.l_whe
8bf0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
8c00: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
8c10: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
8c20: 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
8c30: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
8c40: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
8c50: 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
8c60: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
8c70: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c  k.l_type = (eFil
8c80: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
8c90: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
8ca0: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
8cb0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
8cc0: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
8cd0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
8ce0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
8cf0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
8d00: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
8d10: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
8d20: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
8d30: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
8d40: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
8d50: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
8d60: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
8d70: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
8d80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8d90: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
8da0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
8db0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
8dc0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
8dd0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
8de0: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
8df0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
8e00: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
8e10: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
8e20: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
8e30: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
8e40: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
8e50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
8e60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
8e70: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
8e80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8e90: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
8ea0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
8eb0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
8ec0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
8ed0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
8ee0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
8ef0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
8f00: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28  _SIZE;.    if( (
8f10: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
8f20: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
8f30: 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ck))==(-1) ){.  
8f40: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
8f50: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
8f60: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
8f70: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
8f80: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
8f90: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
8fa0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
8fb0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
8fc0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
8fd0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
8fe0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
8ff0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
9000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 20 21  ){.      if( s !
9010: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
9020: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
9030: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
9040: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
9050: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
9060: 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63  rno; .        rc
9070: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
9080: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
9090: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
90a0: 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  R_UNLOCK); .    
90b0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
90c0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
90d0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
90e0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
90f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9100: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
9110: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9120: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
9130: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9140: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9150: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9160: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
9170: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
9180: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9190: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
91a0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
91b0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
91c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
91e0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
91f0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
9200: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
9210: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
9220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
9230: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
9240: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
9250: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
9260: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
9270: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
9280: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
9290: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
92a0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
92b0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
92c0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
92d0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
92e0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
92f0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
9300: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
9310: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
9320: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
9330: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
9340: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
9350: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
9360: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
9370: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
9380: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
9390: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
93a0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
93b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
93c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
93d0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
93e0: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
93f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53  {.      case RES
9400: 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20  ERVED_LOCK:.    
9410: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9420: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
9430: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9440: 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c  .      case EXCL
9450: 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20  USIVE_LOCK:.    
9460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9470: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
9480: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
9490: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
94a0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
94b0: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
94c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
94d0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  0);.    }.    s 
94e0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
94f0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
9500: 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d  );.    if( s==(-
9510: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
9520: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
9530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
9540: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
9550: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
9560: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
9570: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
9580: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
9590: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
95a0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
95b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95c0: 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  ..#ifndef NDE
95d0: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
95e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
95f0: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
9600: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
9610: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
9620: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
9630: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
9640: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
9650: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
9660: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
9670: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
9680: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
9690: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
96a0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
96b0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
96c0: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
96d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
96e0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
96f0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
9700: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
9710: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
9720: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
9730: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
9740: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
9750: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
9760: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
9770: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
9780: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
9790: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
97a0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
97b0: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
97c0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
97d0: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
97e0: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
97f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
9800: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
9810: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
9820: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
9830: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
9840: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
9850: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
9860: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
9870: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
9880: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
9890: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
98a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
98b0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
98c0: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
98d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
98e0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
98f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9900: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
9910: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
9920: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
9930: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
9940: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20  Unused list..** 
9950: 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  If all such file
9960: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72 65   descriptors are
9970: 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20   closed without 
9980: 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20  error, the list 
9990: 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e  is.** cleared an
99a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
99b0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rned..**.** Othe
99c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
99d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
99e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f  successfully clo
99f0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
9a00: 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61  tor.** entries a
9a10: 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  re removed from 
9a20: 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51  the list, and SQ
9a30: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9a40: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e   returned. .** n
9a50: 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  ot deleted and S
9a60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
9a70: 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  E returned..*/ .
9a80: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
9a90: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
9aa0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
9ab0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9ac0: 4b 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  K;.  unixInodeIn
9ad0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9ae0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9af0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72 72  ixUnusedFd *pErr
9b00: 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  or = 0;.  UnixUn
9b10: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
9b20: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
9b30: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
9b40: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
9b50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
9b60: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
9b70: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66    if( close(p->f
9b80: 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  d) ){.      pFil
9b90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
9ba0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9bb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
9bc0: 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  OSE;.      p->pN
9bd0: 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20  ext = pError;.  
9be0: 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a      pError = p;.
9bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
9c20: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
9c30: 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72 6e  pError;.  return
9c40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
9c50: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
9c60: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
9c70: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
9c80: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
9c90: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
9ca0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
9cb0: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
9cc0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
9cd0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
9ce0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
9cf0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
9d00: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
9d10: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
9d20: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
9d30: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
9d40: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
9d50: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
9d60: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
9d70: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
9d80: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
9d90: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
9da0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9db0: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
9dc0: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
9dd0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
9de0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
9df0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
9e00: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
9e10: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
9e20: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9e30: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
9e40: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
9e50: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
9e60: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
9e70: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
9e80: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
9e90: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
9ea0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
9eb0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
9ec0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
9ed0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
9ee0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
9ef0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
9f00: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
9f10: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
9f20: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
9f30: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
9f40: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
9f50: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
9f60: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
9f70: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
9f80: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
9f90: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
9fa0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
9fb0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
9fc0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
9fd0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
9fe0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
9ff0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
a000: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71   _posixUnlock(sq
a010: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a020: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
a030: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
a040: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
a050: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
a060: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
a070: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
a080: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
a090: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
a0a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
a0b0: 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  t h;.  int tErrn
a0c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
a0d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
a0e0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
a0f0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
a100: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
a110: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
a120: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
a130: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
a140: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
a150: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
a160: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
a170: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
a180: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
a190: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
a1a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
a1b0: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
a1c0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
a1d0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
a1e0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
a1f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
a200: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
a210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a220: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
a230: 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46  utex();.  h = pF
a240: 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65  ile->h;.  pInode
a250: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a260: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
a270: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
a280: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
a290: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
a2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
a2b0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
a2c0: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
a2d0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
a2e0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
a2f0: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
a300: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
a310: 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
a320: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
a330: 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  (0);..#ifndef ND
a340: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
a350: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
a360: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
a370: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
a380: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
a390: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
a3a0: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
a3b0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
a3c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
a3d0: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
a3e0: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
a3f0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
a400: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
a410: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
a420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
a430: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
a440: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
a450: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
a460: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
a470: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
a480: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
a490: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
a4a0: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
a4b0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
a4c0: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
a4d0: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
a4e0: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
a4f0: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
a500: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
a510: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ..    */.#if 0. 
a520: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
a530: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
a540: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
a550: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
a560: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
a570: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
a580: 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  ng==1 );.#endif.
a590: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
a5a0: 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
a5b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
a5c0: 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
a5d0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
a5e0: 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
a5f0: 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
a600: 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
a610: 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
a620: 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
a630: 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
a640: 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
a650: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
a660: 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
a670: 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
a680: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
a690: 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
a6a0: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
a6b0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
a6c0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
a6d0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
a6e0: 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
a6f0: 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
a700: 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
a710: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
a720: 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
a730: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
a740: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
a750: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69  _LOCK ){.      i
a760: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
a770: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66  ck ){.        of
a780: 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48  f_t divSize = SH
a790: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20  ARED_SIZE - 1;. 
a7a0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
a7b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a7c0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
a7d0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a7e0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
a7f0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a800: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
a810: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
a820: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
a830: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
a840: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a850: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
a860: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
a870: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
a880: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
a890: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
a8a0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
a8b0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
a8c0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
a8d0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
a8e0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
a8f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
a900: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
a910: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a920: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
a930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
a940: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
a950: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
a960: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a970: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
a980: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
a990: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
a9a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a9b0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
a9c0: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
a9d0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
a9e0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
a9f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
aa00: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
aa10: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
aa20: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
aa30: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
aa40: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
aa50: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
aa60: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
aa70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
aa80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
aa90: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
aaa0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
aab0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
aac0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
aad0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
aae0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
aaf0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ab00: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
ab10: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ab20: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
ab30: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ab40: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
ab50: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
ab60: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
ab70: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ab80: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ab90: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
aba0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
abb0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
abc0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
abd0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
abe0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
abf0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ac00: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ac10: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ac20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ac30: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ac40: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ac50: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ac60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ac70: 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e{.        lock.
ac80: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
ac90: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
aca0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
acb0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
acc0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
acd0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ace0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
acf0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
ad00: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
ad10: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
ad20: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
ad30: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
ad40: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
ad50: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ad60: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
ad70: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ad80: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
ad90: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ada0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
adb0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
adc0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
add0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
ade0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
adf0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
ae00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae10: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
ae20: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
ae30: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
ae40: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
ae50: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
ae60: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
ae70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
ae80: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
ae90: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
aea0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
aeb0: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
aec0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
aed0: 31 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  1) ){.      pIno
aee0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
aef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
af00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45   }else{.      tE
af10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
af20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
af30: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
af40: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
af50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
af60: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
af70: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
af80: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
af90: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
afa0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
afb0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
afc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
afd0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
afe0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
aff0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
b000: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
b010: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
b020: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
b030: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
b040: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
b050: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
b060: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
b070: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
b080: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
b090: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
b0a0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
b0b0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
b0c0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
b0d0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
b0e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b0f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b100: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
b110: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
b120: 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   0L;.      Simul
b130: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b140: 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
b150: 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
b160: 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
b170: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b180: 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  (0);.      if( f
b190: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
b1a0: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
b1b0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b1c0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
b1d0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
b1e0: 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  e{.        tErrn
b1f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
b200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b210: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b220: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b230: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
b240: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
b250: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
b260: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
b270: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
b280: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
b290: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
b2a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
b2b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
b2c0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
b2d0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
b2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
b2f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
b300: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
b310: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
b320: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
b330: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
b340: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
b350: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
b360: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
b370: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
b380: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
b390: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
b3a0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
b3b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
b3c0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
b3d0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
b3e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
b3f0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
b400: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
b410: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
b420: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
b430: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b440: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b450: 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
b460: 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c   }.  }...end_unl
b470: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
b480: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
b490: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
b4a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
b4b0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
b4c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b4d0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
b4e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
b4f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
b500: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
b510: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
b520: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b530: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
b540: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
b550: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
b560: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
b570: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
b580: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
b590: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
b5a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
b5b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b5c0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
b5d0: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
b5e0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
b5f0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
b600: 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f  k){.  return _po
b610: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
b620: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
b630: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b640: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
b650: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
b660: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
b670: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
b680: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
b690: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
b6a0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
b6b0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
b6c0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
b6d0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
b6e0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
b6f0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
b700: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
b710: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
b720: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
b730: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
b740: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
b750: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
b760: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
b770: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
b780: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
b790: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
b7a0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
b7b0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
b7c0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
b7d0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
b7e0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
b7f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b800: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b810: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
b820: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
b830: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  fd>=0 ){.      i
b840: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
b850: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
b860: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b870: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b880: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
b890: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b8b0: 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65  _CLOSE;.      }e
b8c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
b8d0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
b8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b8f0: 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
b900: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
b910: 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e   = close(pFile->
b920: 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  h);.      if( er
b930: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
b940: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b950: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
b960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
b970: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
b980: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56  }.    }.#if OS_V
b990: 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20 70  XWORKS.    if( p
b9a0: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
b9b0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73     if( pFile->is
b9c0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
b9d0: 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e    unlink(pFile->
b9e0: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
b9f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
ba00: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
ba10: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
ba20: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  pId);.      pFil
ba30: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20 20  e->pId = 0;.    
ba40: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53 54  }.#endif.    OST
ba50: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
ba60: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
ba70: 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ));.    OpenCoun
ba80: 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c  ter(-1);.    sql
ba90: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
baa0: 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20 6d  >pUnused);.    m
bab0: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
bac0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
bad0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
baf0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
bb00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bb10: 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
bb20: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
bb30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bb40: 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
bb50: 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
bb60: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
bb70: 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c  )id;.    unixUnl
bb80: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
bb90: 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
bba0: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
bbb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
bbc0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
bbd0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
bbe0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
bbf0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
bc00: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
bc10: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
bc20: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
bc30: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
bc40: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
bc50: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
bc60: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
bc70: 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
bc80: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
bc90: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
bca0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
bcb0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
bcc0: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
bcd0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
bce0: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
bcf0: 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
bd00: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
bd10: 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
bd20: 65 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  eInfo(pFile->pIn
bd30: 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ode);.    rc = c
bd40: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
bd50: 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
bd60: 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
bd70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
bd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
bd90: 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
bda0: 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
bdb0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
bdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
bdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
be90: 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
bea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
bec0: 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
bed0: 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
bee0: 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
bef0: 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
bf00: 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
bf10: 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
bf20: 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
bf30: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
bf40: 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
bf50: 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
bf60: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
bf70: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
bf80: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
bf90: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
bfa0: 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
bfb0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
bfc0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
bfd0: 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
bfe0: 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
bff0: 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
c000: 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
c010: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
c020: 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
c030: 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
c040: 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
c050: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
c060: 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
c070: 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
c080: 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
c090: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
c0a0: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
c0b0: 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
c0c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
c0d0: 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
c0e0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
c0f0: 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
c100: 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
c110: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
c120: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
c130: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
c140: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
c150: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
c160: 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
c170: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
c180: 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
c190: 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
c1a0: 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
c1b0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
c1c0: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
c1d0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
c1e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
c1f0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
c200: 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
c210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c220: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
c230: 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
c240: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
c250: 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
c260: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
c270: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
c280: 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
c290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
c2a0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
c2b0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
c2c0: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
c2d0: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
c2e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
c2f0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
c300: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
c310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c320: 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
c330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
c340: 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
c350: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
c360: 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
c370: 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
c380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c390: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
c3a0: 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
c3b0: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
c3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
c3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
c420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c480: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
c490: 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
c4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c4c0: 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
c4d0: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
c4e0: 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
c4f0: 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65   existance of se
c500: 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
c510: 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  iles in order to
c520: 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
c530: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
c540: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20    This works on 
c550: 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76  just.** about ev
c560: 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
c570: 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
c580: 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
c590: 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
c5a0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
c5b0: 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
c5c0: 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
c5d0: 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
c5e0: 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
c5f0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
c600: 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
c610: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
c620: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
c630: 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
c640: 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
c650: 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
c660: 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
c670: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
c680: 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
c690: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
c6a0: 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
c6b0: 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
c6c0: 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
c6d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
c6e0: 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
c6f0: 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
c700: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
c710: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
c720: 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
c730: 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
c740: 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69  reating a file i
c750: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
c760: 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64  tory as the.** d
c770: 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
c780: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
c790: 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
c7a0: 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
c7b0: 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61  d..** The exista
c7c0: 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69  nce of a lock fi
c7d0: 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  le implies an EX
c7e0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
c7f0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a  ll other lock.**
c800: 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
c810: 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
c820: 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
c830: 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
c840: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
c850: 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
c860: 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
c870: 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
c880: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
c890: 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  * lock file..*/.
c8a0: 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
c8b0: 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
c8c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c8d0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c8e0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c8f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c900: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c910: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c920: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c930: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c940: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
c950: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
c960: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
c970: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
c980: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
c990: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
c9a0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
c9b0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
c9c0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
c9d0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
c9e0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
c9f0: 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
ca00: 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
ca10: 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
ca20: 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
ca30: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
ca40: 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
ca50: 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
ca60: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
ca70: 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
ca80: 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
ca90: 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
caa0: 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
cab0: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
cac0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
cad0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
cae0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
caf0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
cb00: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cb10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
cb20: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
cb30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
cb50: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
cb60: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
cb70: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
cb80: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
cb90: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cba0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
cbb0: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
cbc0: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
cbd0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
cbe0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
cbf0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
cc00: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
cc10: 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
cc20: 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
cc30: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
cc40: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
cc50: 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
cc60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
cc70: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
cc80: 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
cc90: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
cca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ccb0: 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
ccc0: 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
ccd0: 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
cce0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
ccf0: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
cd00: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
cd10: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
cd20: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
cd30: 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a  erved = access(z
cd40: 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
cd50: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
cd60: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
cd70: 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
cd80: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
cd90: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
cda0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
cdb0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
cdc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
cdd0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
cde0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
cdf0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
ce00: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
ce10: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
ce20: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
ce30: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
ce40: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
ce50: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
ce60: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
ce70: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
ce80: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
ce90: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
cea0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
ceb0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
cec0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
ced0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
cee0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
cef0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
cf00: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
cf10: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
cf20: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
cf30: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
cf40: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
cf50: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
cf60: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
cf70: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
cf80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
cf90: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
cfa0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
cfb0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
cfc0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
cfd0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
cfe0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
cff0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
d000: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
d010: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
d020: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
d030: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
d040: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
d050: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
d060: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
d070: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
d080: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d090: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
d0a0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
d0b0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
d0c0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
d0d0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
d0e0: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
d0f0: 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
d100: 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
d110: 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
d120: 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
d130: 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
d140: 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
d150: 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
d160: 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
d170: 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
d180: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d190: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
d1a0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
d1b0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d1c0: 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
d1d0: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
d1e0: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
d1f0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
d200: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
d210: 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
d220: 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
d230: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
d240: 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
d250: 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
d260: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
d270: 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
d280: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
d290: 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
d2a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
d2b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
d2c0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
d2d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d2e0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21  eFileLock;.#if !
d2f0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f  OS_VXWORKS.    /
d300: 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
d310: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
d320: 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
d330: 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
d340: 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
d350: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
d360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d370: 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
d380: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
d390: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f  .  fd = open(zLo
d3a0: 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckFile,O_RDONLY|
d3b0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
d3c0: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
d3d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
d3e0: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
d3f0: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
d400: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
d410: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
d420: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
d430: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d440: 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
d450: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
d460: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
d470: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
d480: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d490: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d4a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d4b0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d4c0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d4d0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d4e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d4f0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d520: 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64   .  if( close(fd
d530: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
d540: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
d550: 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
d560: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
d570: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20    }.  .  /* got 
d580: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
d590: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
d5a0: 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
d5b0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
d5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d5d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
d5e0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d5f0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
d600: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
d610: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
d620: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
d630: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
d640: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
d650: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
d660: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
d670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
d680: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
d690: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
d6a0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
d6b0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
d6c0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
d6d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
d6e0: 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
d6f0: 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
d700: 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
d710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d720: 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
d730: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d740: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
d750: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
d760: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
d770: 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
d780: 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
d790: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
d7a0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
d7b0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d7c0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
d7d0: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
d7e0: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
d7f0: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
d800: 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
d810: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
d820: 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
d830: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
d840: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
d850: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
d860: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
d870: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d880: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
d890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
d8b0: 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
d8c0: 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
d8d0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
d8e0: 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
d8f0: 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
d900: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
d910: 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
d920: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
d930: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
d940: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
d950: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d960: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d970: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d980: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
d990: 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
d9a0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
d9b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
d9c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
d9d0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
d9e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75  _LOCK );.  if( u
d9f0: 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
da00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
da10: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   0;.    int tErr
da20: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
da30: 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
da40: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
da50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
da60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
da70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
da80: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  R_UNLOCK);.    }
da90: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
daa0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
dab0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dac0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dad0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
dae0: 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
daf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
db00: 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
db10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
db20: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
db30: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
db40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
db50: 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
db60: 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
db70: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
db80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
db90: 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
dba0: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
dbb0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
dbc0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
dbd0: 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
dbe0: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
dbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
dc00: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
dc10: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
dc20: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
dc30: 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
dc40: 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
dc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
dc60: 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
dc70: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
dc80: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
dc90: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
dca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
dd60: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
dd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
dd90: 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
dda0: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
ddb0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
ddc0: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
ddd0: 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
dde0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
ddf0: 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
de00: 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
de10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
de20: 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
de30: 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
de40: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
de50: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
de60: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
de70: 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
de80: 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
de90: 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
dea0: 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
deb0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
dec0: 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
ded0: 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
dee0: 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
def0: 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
df00: 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
df10: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
df20: 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
df30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
df40: 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
df50: 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
df60: 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
df70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
df80: 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
df90: 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
dfa0: 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
dfb0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
dfc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
dfd0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
dfe0: 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
dff0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
e000: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
e010: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
e020: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
e030: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
e040: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
e050: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
e060: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
e070: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
e080: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
e090: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
e0a0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
e0b0: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
e0c0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
e0d0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
e0e0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
e0f0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
e100: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
e110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
e120: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
e130: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
e140: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
e150: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
e160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e170: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
e180: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e190: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e1a0: 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
e1b0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
e1c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
e1d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
e1e0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
e1f0: 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
e200: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
e210: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
e220: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
e230: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
e240: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
e250: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e260: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
e270: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
e280: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
e290: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
e2a0: 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
e2b0: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
e2c0: 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
e2d0: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
e2e0: 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
e2f0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
e300: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
e310: 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
e320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
e330: 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
e340: 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
e350: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
e360: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
e370: 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
e380: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
e390: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e3a0: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
e3b0: 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
e3c0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
e3d0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e3e0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e3f0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e400: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
e410: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e420: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
e430: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
e440: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e450: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e460: 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
e470: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e480: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
e490: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
e4a0: 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
e4b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
e4c0: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
e4d0: 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
e4e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
e4f0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e500: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e510: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e520: 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
e530: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e540: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
e550: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e560: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
e570: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
e580: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e590: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
e5a0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
e5b0: 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
e5c0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
e5d0: 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
e5e0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
e5f0: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
e600: 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
e610: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
e620: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
e630: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e640: 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
e650: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e660: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
e670: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
e680: 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
e690: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
e6a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e6b0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
e6c0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
e6d0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
e6e0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
e6f0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
e700: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
e710: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
e720: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
e730: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
e740: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
e750: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
e760: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
e770: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
e780: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
e790: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
e7a0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
e7b0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
e7c0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
e7d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
e7e0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
e7f0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
e800: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
e810: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
e820: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
e830: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
e840: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
e850: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
e860: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
e870: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
e880: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
e890: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
e8a0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
e8b0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
e8c0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
e8d0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
e8e0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
e8f0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e900: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
e910: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
e920: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
e930: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e940: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
e950: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
e960: 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
e970: 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
e980: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
e990: 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
e9a0: 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
e9b0: 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
e9c0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
e9d0: 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
e9e0: 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
e9f0: 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
ea00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
ea10: 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
ea20: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
ea30: 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
ea40: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
ea50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ea60: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
ea70: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
ea80: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
ea90: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
eaa0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
eab0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
eac0: 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
ead0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
eae0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
eaf0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
eb00: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
eb10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
eb20: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
eb30: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
eb40: 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
eb50: 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
eb60: 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
eb70: 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
eb80: 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
eb90: 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
eba0: 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
ebb0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
ebc0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
ebd0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
ebe0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
ebf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ec00: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
ec10: 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
ec20: 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
ec30: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
ec40: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
ec50: 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
ec60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ec70: 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
ec80: 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
ec90: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eca0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
ecb0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
ecc0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
ecd0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ece0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
ecf0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ed00: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
ed10: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
ed20: 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
ed30: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
ed40: 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
ed50: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ed60: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ed70: 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
ed80: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
ed90: 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
eda0: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
edb0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
edc0: 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
edd0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
ede0: 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
edf0: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
ee00: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
ee10: 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
ee20: 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
ee30: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
ee40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ee50: 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
ee60: 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
ee70: 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
ee80: 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
ee90: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
eea0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
eeb0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
eec0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
eed0: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
eee0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
eef0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
ef00: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
ef10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
ef20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
ef30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
ef40: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ef50: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
ef60: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
ef70: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
ef80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ef90: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
efa0: 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
efb0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
efc0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
efd0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
efe0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
eff0: 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
f000: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
f010: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
f020: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
f030: 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
f040: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
f050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
f060: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
f070: 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
f080: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
f090: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
f0a0: 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
f0b0: 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
f0c0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
f0d0: 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
f0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
f100: 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
f110: 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
f120: 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
f130: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
f140: 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
f150: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
f160: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
f170: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
f180: 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
f190: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
f1a0: 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
f1b0: 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e   unlock. */.  in
f1c0: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
f1d0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
f1e0: 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
f1f0: 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d   int r, tErrno =
f200: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20   errno;.    r = 
f210: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f220: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f230: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
f240: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
f250: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29  IS_LOCK_ERROR(r)
f260: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
f270: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f280: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  rno;.    }.#ifde
f290: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
f2a0: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
f2b0: 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20 53  S.    if( (r & S
f2c0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
f2d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
f2e0: 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45        r = SQLITE
f2f0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BUSY;.    }.#en
f300: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
f310: 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
f320: 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20  ERRORS */.    . 
f330: 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d     return r;.  }
f340: 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
f350: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
f360: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
f370: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f380: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
f390: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
f3a0: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
f3b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
f3c0: 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
f3d0: 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
f3e0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
f3f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
f400: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f410: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
f420: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f430: 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
f440: 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f460: 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
f470: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
f480: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
f560: 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
f570: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f590: 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
f5a0: 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
f5b0: 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
f5c0: 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
f5d0: 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
f5e0: 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
f5f0: 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
f600: 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
f610: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
f620: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
f630: 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
f640: 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
f650: 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
f660: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f670: 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
f680: 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
f690: 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
f6a0: 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
f6b0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f6c0: 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
f6d0: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
f6e0: 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
f6f0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
f700: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
f710: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
f720: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
f730: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
f740: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
f750: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
f760: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
f770: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
f780: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
f790: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
f7a0: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
f7b0: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
f7c0: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
f7d0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
f7e0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
f7f0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
f800: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
f810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
f820: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f830: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f840: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f850: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f860: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f870: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f880: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f890: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f8a0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f8b0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f8c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f8d0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f8e0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f8f0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f900: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f910: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f920: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f930: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
f940: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
f950: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
f960: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
f970: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
f980: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
f990: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
f9a0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
f9b0: 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
f9c0: 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
f9d0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
f9e0: 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
f9f0: 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
fa00: 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
fa10: 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
fa20: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
fa30: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
fa40: 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
fa50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fa60: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
fa70: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
fa80: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
fa90: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
faa0: 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
fab0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
fac0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
fad0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
fae0: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
faf0: 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
fb00: 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
fb10: 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
fb20: 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
fb30: 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
fb40: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
fb50: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
fb60: 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
fb70: 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
fb80: 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
fb90: 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
fba0: 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
fbb0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
fbc0: 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
fbd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
fbe0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
fbf0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
fc00: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
fc10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
fc20: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
fc30: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
fc40: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
fc50: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
fc60: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
fc70: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
fc80: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
fc90: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
fca0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
fcb0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
fcc0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
fcd0: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
fce0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
fcf0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
fd00: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
fd10: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
fd20: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
fd30: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
fd40: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
fd50: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
fd60: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
fd70: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
fd80: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
fd90: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
fda0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
fdb0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
fdc0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
fdd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
fde0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
fdf0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
fe00: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
fe10: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
fe20: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
fe30: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
fe40: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
fe50: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
fe60: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
fe70: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
fe80: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
fe90: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
fea0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
feb0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
fec0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
fed0: 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
fee0: 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
fef0: 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
ff00: 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
ff10: 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
ff20: 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
ff30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
ff40: 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
ff50: 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
ff60: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
ff70: 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
ff80: 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
ff90: 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
ffa0: 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
ffb0: 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
ffc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ffd0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
ffe0: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
fff0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
10000 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
10010 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
10020 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
10030 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63  tatic int semLoc
10040 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10050 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
10060 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
10070 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10080 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
10090 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
100a0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
100b0 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
100c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
100d0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
100e0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
100f0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
10100 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
10110 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
10120 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
10130 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
10140 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
10150 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
10160 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10170 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
10180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10190 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
101a0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
101b0 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
101c0 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
101d0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
101e0 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
101f0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
10200 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
10210 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10220 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
10230 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
10240 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10250 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
10260 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
10270 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
10280 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
10290 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
102a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
102b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
102c0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
102d0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
102e0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
102f0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
10300 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
10310 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
10320 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
10330 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
10340 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10350 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
10360 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
10370 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
10380 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
10390 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
103a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
103b0 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
103c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
103d0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
103e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
103f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10400 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
10410 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
10420 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
10430 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
10440 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
10450 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
10460 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
10470 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
10480 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
10490 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
104a0 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
104b0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
104c0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
104d0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
104e0 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
104f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10500 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
10510 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
10520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10530 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
10540 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
10550 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
10560 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
10570 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
10580 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10590 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
105a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
105b0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
105c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
105e0 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
105f0 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
10600 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
10610 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
10620 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10630 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10640 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10650 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10660 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
10670 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10680 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10690 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
106a0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
106b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
106c0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
106d0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
106e0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
106f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
10700 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
10710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
10720 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
10730 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
10740 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
10750 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10760 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
10770 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
10780 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
10790 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
107a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
107b0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
107c0 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49  ckInfo(pFile->pI
107d0 6e 6f 64 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  node);.    unixL
107e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
107f0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10800 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
10810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
10820 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
10830 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
10840 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
10850 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
10860 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
10870 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
10880 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10890 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
108a0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
108b0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
108c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
10990 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
109c0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
109d0 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
109e0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
109f0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
10a00 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
10a10 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
10a20 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
10a30 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
10a40 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
10a50 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
10a60 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
10a70 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
10a80 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
10a90 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
10aa0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
10ab0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
10ac0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10ad0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
10ae0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
10af0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
10b00 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
10b10 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
10b20 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
10b30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
10b40 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
10b50 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
10b60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
10b70 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
10b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
10b90 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
10ba0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10bb0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
10bc0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
10bd0 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
10be0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
10bf0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
10c00 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
10c10 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
10c20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
10c30 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
10c40 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
10c50 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
10c60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
10c70 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
10c80 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
10c90 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
10ca0 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
10cb0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10cc0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
10cd0 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
10ce0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
10cf0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10d00 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
10d10 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
10d20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
10d30 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
10d40 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
10d70 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
10d80 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
10d90 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
10da0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
10db0 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
10dc0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
10dd0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
10de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
10df0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
10e00 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
10e10 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
10e20 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
10e30 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
10e40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10e50 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
10e60 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
10e70 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
10e80 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
10e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
10ea0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
10eb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10ec0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
10ed0 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
10ee0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10ef0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
10f00 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
10f10 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
10f20 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
10f30 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
10f40 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
10f50 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
10f60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
10f70 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
10f80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10f90 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
10fa0 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
10fb0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
10fc0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
10fd0 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
10fe0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
10ff0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
11000 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
11010 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
11020 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
11030 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
11040 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
11050 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
11060 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
11070 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
11080 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
11090 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
110a0 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
110b0 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
110c0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
110d0 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
110e0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
110f0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
11100 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
11110 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
11120 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
11130 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
11140 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
11150 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
11160 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
11170 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
11180 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
11190 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
111a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
111b0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
111c0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
111d0 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
111e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
111f0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
11200 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
11210 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11220 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
11230 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
11240 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
11250 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
11260 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11270 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
112a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
112b0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
112c0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
112d0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
112e0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
112f0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
11300 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11310 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11320 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11330 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
11340 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
11350 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
11360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
11370 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11380 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
11390 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
113a0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
113b0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
113c0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
113d0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
113e0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
113f0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11400 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11410 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11420 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11430 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11440 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11450 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11460 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
11470 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11480 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
11490 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
114a0 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
114b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
114c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
114d0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
114e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
114f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11500 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11510 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11520 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11530 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11540 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11550 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11560 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
11570 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11580 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
11590 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
115a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
115b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
115c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
115d0 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
115e0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
115f0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
11600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11610 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
11620 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
11630 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
11640 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
11650 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
11660 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
11670 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
11680 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
11690 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
116a0 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
116b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
116c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
116d0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
116e0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
116f0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
11700 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
11710 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
11720 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
11730 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
11740 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
11750 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
11760 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
11770 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
11780 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
11790 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
117a0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
117b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
117c0 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
117d0 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
117e0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
117f0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
11800 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
11810 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
11820 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
11830 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
11840 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
11850 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
11860 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11870 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
11880 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
11890 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
118a0 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
118b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
118c0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
118d0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
118e0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
118f0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
11900 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
11910 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
11920 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11930 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11940 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
11950 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
11960 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
11970 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11990 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
119a0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
119b0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
119c0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
119d0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
119e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
119f0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11a00 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11a10 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11a20 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11a30 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11a40 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11a50 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11a60 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11a70 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11a80 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
11a90 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
11aa0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
11ab0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
11ac0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
11ad0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
11ae0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11af0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11b00 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11b10 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11b20 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11b30 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11b40 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11b50 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11b60 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11b70 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11b80 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
11b90 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
11ba0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
11bb0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
11bc0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
11bd0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
11be0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11bf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11c00 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11c10 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11c20 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11c30 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11c50 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
11c60 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
11c70 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
11c80 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
11c90 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
11ca0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
11cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
11cc0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11cd0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11ce0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
11cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11d00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11d10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11d20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
11d30 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11d40 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
11d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
11d60 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
11d70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
11d80 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
11d90 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
11da0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
11db0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
11dc0 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
11dd0 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
11de0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11df0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e00 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
11e10 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
11e20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
11e30 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11e40 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
11e50 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
11e60 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
11e70 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
11e80 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
11e90 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
11ea0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
11eb0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
11ec0 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
11ed0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
11ee0 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
11ef0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
11f00 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
11f10 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
11f20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
11f30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
11f40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
11f50 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
11f60 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
11f70 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
11f80 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
11f90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
11fa0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
11fb0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
11fc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11fe0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
11ff0 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
12000 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
12010 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
12020 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
12030 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
12040 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
12050 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
12060 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
12070 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
12080 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
12090 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
120a0 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
120b0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
120c0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
120d0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
120e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
120f0 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
12100 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
12110 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12120 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
12130 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
12140 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
12150 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
12160 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
12170 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
12180 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12190 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
121a0 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
121b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
121c0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
121d0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
121e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
121f0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
12200 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
12210 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
12220 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
12230 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
12240 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
12250 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
12260 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
12270 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
12280 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
12290 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
122a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
122b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
122c0 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
122d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
122e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
122f0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12300 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
12310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12320 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
12330 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
12340 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
12350 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
12360 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
12370 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
12380 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
12390 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
123a0 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
123b0 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
123c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
123d0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
123e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
123f0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
12400 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
12410 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
12420 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
12430 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
12440 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
12450 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
12460 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
12470 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
12480 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
12490 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
124a0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
124b0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
124c0 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
124d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
124e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
124f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
12500 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
12510 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
12520 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
12530 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
12540 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
12550 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
12560 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
12570 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
12580 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
12590 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
125a0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
125b0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
125c0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
125d0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
125e0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
125f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
12600 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
12610 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
12620 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
12630 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
12640 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
12650 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
12660 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
12670 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12680 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
12690 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
126a0 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
126b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
126c0 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
126d0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
126e0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
126f0 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
12700 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
12710 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
12720 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
12730 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
12740 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
12750 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
12760 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
12770 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
12780 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
12790 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
127a0 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20  Errno;.    long 
127b0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
127c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
127d0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
127e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
127f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
12800 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
12810 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
12820 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
12830 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
12840 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
12850 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
12860 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
12870 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
12880 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
12890 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
128a0 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
128b0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
128c0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
128d0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
128e0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
128f0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
12900 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
12910 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
12920 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12930 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
12940 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
12950 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
12960 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
12970 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12980 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
12990 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
129a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
129b0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
129c0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
129d0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
129e0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
129f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12a00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
12a10 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
12a20 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
12a30 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12a40 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
12a50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12a60 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
12a70 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
12a80 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12a90 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12aa0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12ab0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
12ac0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
12ad0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
12ae0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
12af0 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
12b00 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
12b10 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
12b20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
12b30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12b40 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
12b50 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
12b60 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
12b70 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
12b80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
12b90 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
12ba0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
12bb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
12bc0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
12bd0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
12be0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
12bf0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
12c00 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
12c10 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
12c20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
12c30 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
12c40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
12c50 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
12c60 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
12c70 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
12c80 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
12c90 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
12ca0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
12cb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
12cc0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
12cd0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
12ce0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
12cf0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
12d00 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
12d10 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
12d20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
12d30 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
12d40 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
12d50 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
12d60 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
12d70 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
12d80 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
12d90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
12da0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
12db0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
12dc0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
12dd0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
12de0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
12df0 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
12e00 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
12e10 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
12e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12e30 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
12e40 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
12e50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
12e60 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
12e70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12e80 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
12e90 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
12ea0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
12eb0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
12ec0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
12ed0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
12ee0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
12ef0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
12f00 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
12f10 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
12f20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
12f30 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
12f40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
12f50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
12f60 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
12f90 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
12fa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
12fb0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
12fc0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
12fd0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
12fe0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
12ff0 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
13000 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
13010 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13020 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13030 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
13070 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
13080 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
13090 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
130a0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
130b0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
130d0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
130e0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
130f0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
13100 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
13110 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
13120 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
13130 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
13140 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
13150 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
13160 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
13170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
13180 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
13190 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
131a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
131b0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
131c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
131d0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
131e0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
131f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
13200 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
13210 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
13220 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
13230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
13240 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
13250 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
13260 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
13270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13280 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13290 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
132a0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
132b0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
132c0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
132d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
132e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
132f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13300 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
13310 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
13320 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
13330 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
13340 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
13350 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13360 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
13370 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
13380 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
13390 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
133a0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
133b0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
133c0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
133d0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
133e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
133f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13400 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13410 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13420 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
13430 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
13440 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
13450 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
13460 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
13470 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13480 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13490 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
134a0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
134b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
134c0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
134d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134f0 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
13500 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13510 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
13520 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13530 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
13540 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13550 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
13560 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
13570 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13580 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
13590 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
135a0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
135b0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
135c0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
135d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
135e0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
135f0 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
13600 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13610 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
13620 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
13630 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
13640 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
13650 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
13660 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13670 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
13680 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
13690 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
136a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
136b0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
136c0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
136d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
136e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
136f0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13700 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
13710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13720 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
13730 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
13740 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
13750 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
13760 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
13770 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
13780 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
13790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
137a0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
137b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
137c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
137d0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
137e0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
137f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13800 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
13810 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13820 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
13830 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13840 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
13850 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
13860 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
13870 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
13880 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
13890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
138a0 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
138b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
138c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
138d0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
138e0 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
138f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
13900 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
13910 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
13920 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
13930 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
13940 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
13950 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
13960 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
13970 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
13980 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
13990 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
139a0 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
139b0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
139c0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
139d0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
139e0 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
139f0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
13a00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
13a10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
13a20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
13a30 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
13a40 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
13a50 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
13a60 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
13a70 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
13a80 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
13a90 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
13aa0 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
13ab0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13ac0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13ad0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
13ae0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13af0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13b00 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
13b10 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
13b20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
13b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13b40 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13b50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
13b60 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b  e->nShared>1) ){
13b70 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
13b80 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
13b90 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
13ba0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
13bb0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
13bc0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
13bd0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
13be0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
13bf0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13c00 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13c10 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
13c20 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
13c30 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
13c40 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68  {.        skipSh
13c50 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ared = 1;.      
13c60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13c80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13c90 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
13ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
13cb0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13cc0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13cd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
13ce0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
13cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d00 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
13d10 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  leLock>=RESERVED
13d20 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74  _LOCK && context
13d30 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
13d40 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13d50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13d60 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
13d70 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
13d80 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
13d90 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ){ .        cont
13da0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
13db0 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0; .      }.    
13dc0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13dd0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
13de0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13df0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
13e00 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20  hared>1)){.     
13e10 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
13e20 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
13e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e50 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  && eFileLock==NO
13e60 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a  _LOCK ){..    /*
13e70 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
13e80 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
13e90 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
13ea0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
13eb0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
13ec0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
13ed0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
13ee0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
13ef0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
13f00 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
13f10 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
13f20 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
13f30 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
13f40 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
13f50 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f  edByte;.    pIno
13f60 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
13f70 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
13f80 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
13f90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fa0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
13fb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fc0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
13fd0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13fe0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
13ff0 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72     if( !skipShar
14000 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ed ){.        rc
14010 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14020 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14030 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
14040 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
14050 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
14060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  rc ){.        pI
14070 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
14080 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
14090 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
140a0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
140b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
140c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
140d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  OK ){.      pIno
140e0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
140f0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
14100 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
14110 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
14120 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
14130 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 50       rc = closeP
14140 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
14150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14160 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
14170 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
14180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14190 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
141a0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
141b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
141c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
141d0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
141e0 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
141f0 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
14200 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
14210 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14220 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
14230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14240 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
14250 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14260 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
14270 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
14280 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
14290 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
142a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
142b0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
142c0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
142d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
142e0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
142f0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
14300 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
14310 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
14320 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
14330 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
14340 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
14350 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
14360 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
14370 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
14380 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
14390 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
143a0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
143b0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
143c0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
143d0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
143e0 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
143f0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
14400 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  }.    releaseLoc
14410 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e  kInfo(pFile->pIn
14420 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ode);.    sqlite
14430 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
14440 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
14450 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
14460 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
14470 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14480 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14490 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
144a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
144b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
144c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
144d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
144e0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
144f0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
14500 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
14510 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
14520 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
14530 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
14540 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
14550 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
14560 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
14570 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
14580 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
14590 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
145a0 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
145b0 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
145c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
145e0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
145f0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14600 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
14610 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
146e0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14700 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
14710 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
14720 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
14730 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
14740 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
14750 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14760 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14770 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
14780 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
14790 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
147a0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
147b0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
147c0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
147d0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
147e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
147f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14800 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
14810 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
14820 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
14830 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
14840 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
14850 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
14860 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14870 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
14880 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f  eturn _posixUnlo
14890 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
148a0 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
148b0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
148c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
148d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
148e0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
148f0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
14900 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
14910 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
14920 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
14930 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
14940 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
14950 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
14960 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
14970 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
14980 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
14990 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
149b0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
149c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14a30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a80 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14a90 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
14aa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
14ab0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
14ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ad0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
14ae0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
14af0 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
14b00 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
14b10 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
14b20 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
14b30 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
14b40 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
14b50 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
14b60 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
14b70 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
14b80 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
14b90 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
14ba0 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
14bb0 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
14bc0 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
14bd0 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
14be0 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
14bf0 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
14c00 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
14c10 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
14c20 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
14c30 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14c40 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
14c50 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
14c60 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
14c70 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14c80 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
14c90 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
14ca0 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
14cb0 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
14cc0 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
14cd0 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
14ce0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
14cf0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
14d00 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
14d10 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
14d20 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
14d30 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
14d40 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
14d50 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
14d60 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
14d70 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
14d80 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
14d90 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
14da0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
14db0 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
14dc0 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
14dd0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
14de0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
14df0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
14e00 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
14e10 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
14e20 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
14e30 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
14e40 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
14e50 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
14e60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
14e70 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
14e80 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
14e90 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
14ea0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
14eb0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
14ec0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
14ed0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
14ee0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
14ef0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
14f00 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
14f10 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
14f20 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14f30 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14f40 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14f50 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
14f60 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20  _PREAD64).  got 
14f70 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  = pread64(id->h,
14f80 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
14f90 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  et);.  SimulateI
14fa0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
14fb0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f   );.#else.  newO
14fc0 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
14fd0 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
14fe0 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61  K_SET);.  Simula
14ff0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
15000 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20  fset-- );.  if( 
15010 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
15020 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  t ){.    if( new
15030 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
15040 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
15050 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
15060 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65   = errno;.    }e
15070 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  lse{.      ((uni
15080 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15090 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
150a0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
150b0 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72  1;.  }.  got = r
150c0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
150d0 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
150e0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
150f0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
15100 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
15110 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
15120 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15130 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
15140 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
15150 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
15160 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
15170 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
15180 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  got;.}../*.** Re
15190 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
151a0 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
151b0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
151c0 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
151d0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
151e0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
151f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
15200 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
15210 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
15220 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
15230 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
15240 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
15250 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
15260 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
15270 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
15280 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15290 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
152a0 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
152b0 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ( id );..  /* If
152c0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
152d0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
152e0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
152f0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15300 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15310 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15320 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15330 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15340 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15350 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15360 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15370 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15380 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15390 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
153a0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
153b0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
153c0 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
153d0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
153e0 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
153f0 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
15400 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
15410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
15420 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
15430 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
15440 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
15450 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
15460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15470 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
15480 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15490 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
154a0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
154b0 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
154c0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
154d0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
154e0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
154f0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
15500 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
15510 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
15520 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15530 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
15540 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
15550 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
15560 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
15570 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
15580 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
15590 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
155a0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
155b0 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
155c0 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
155d0 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
155e0 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
155f0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
15600 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
15610 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
15620 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
15630 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15640 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
15650 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
15660 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
15670 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
15680 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
15690 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
156a0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
156b0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
156c0 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
156d0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
156e0 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
156f0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
15700 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28  .  got = pwrite(
15710 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
15720 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  , offset);.#elif
15730 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
15740 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
15750 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
15760 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
15770 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
15780 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
15790 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
157a0 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
157b0 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
157c0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
157d0 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
157e0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
157f0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
15800 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
15810 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15820 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15830 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
15840 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
15850 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
15860 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
15870 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
15880 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
15890 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
158a0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
158b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
158c0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
158d0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
158e0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
158f0 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
15900 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
15910 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
15920 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
15930 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
15940 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
15950 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
15960 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
15970 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
15980 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
15990 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
159a0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
159b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
159c0 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
159d0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
159e0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
159f0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
15a00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15a10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15a20 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
15a30 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
15a40 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
15a50 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
15a60 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
15a70 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
15a80 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
15a90 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
15aa0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
15ab0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
15ac0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
15ad0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
15ae0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
15af0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
15b00 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
15b10 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
15b20 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
15b30 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
15b40 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
15b50 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
15b60 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
15b70 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
15b80 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
15b90 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
15ba0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
15bb0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
15bc0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
15bd0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
15be0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
15bf0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
15c00 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
15c10 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
15c20 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
15c30 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
15c40 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
15c50 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
15c60 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
15c70 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
15c80 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
15c90 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
15ca0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
15cb0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
15cc0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
15cd0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
15ce0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
15cf0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
15d00 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
15d10 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
15d20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
15d30 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
15d40 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
15d50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
15d60 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
15d70 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
15d80 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
15d90 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
15da0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
15db0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
15dc0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
15dd0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
15de0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
15df0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
15e00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
15e10 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
15e20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
15e30 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
15e40 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
15e50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
15e60 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
15e70 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
15e80 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
15e90 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
15ea0 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
15eb0 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
15ec0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
15ed0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
15ee0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
15ef0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
15f00 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
15f10 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
15f20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
15f30 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
15f40 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
15f50 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
15f60 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
15f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
15f80 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
15f90 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
15fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15fb0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
15fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15fd0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15fe0 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
15ff0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
16000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16010 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
16020 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16030 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
16040 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
16050 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
16060 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
16070 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
16080 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
16090 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
160a0 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
160b0 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
160c0 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
160d0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
160e0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
160f0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
16100 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
16110 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
16120 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
16130 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
16140 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
16150 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
16160 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
16170 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
16180 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
16190 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f  ck with the (slo
161a0 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a  wer) fsync()..**
161b0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
161c0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
161d0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
161e0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
161f0 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
16200 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
16210 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
16220 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
16230 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
16240 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  & !defined(__lin
16250 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66  ux__).# define f
16260 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
16270 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
16280 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
16290 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
162a0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
162b0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
162c0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
162d0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
162e0 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
162f0 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
16300 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
16310 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
16320 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
16330 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
16340 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
16350 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
16360 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
16370 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
16380 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
16390 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
163a0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
163b0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
163c0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
163d0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
163e0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
163f0 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
16400 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
16410 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
16420 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
16430 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
16440 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
16450 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
16460 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
16470 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
16480 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
16490 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
164a0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
164b0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
164c0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
164d0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
164e0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
164f0 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
16500 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
16510 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
16520 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
16530 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
16540 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
16550 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16560 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
16570 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
16580 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
16590 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
165a0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
165b0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
165c0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
165d0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
165e0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
165f0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
16600 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
16610 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
16620 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
16630 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
16640 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
16650 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
16660 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
16670 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
16680 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
16690 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
166a0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
166b0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
166c0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
166d0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
166e0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
166f0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16700 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
16710 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
16720 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
16730 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
16740 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
16750 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
16760 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
16770 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
16780 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
16790 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
167a0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
167b0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
167c0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
167d0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
167e0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
167f0 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
16800 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
16810 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
16820 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
16830 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
16840 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
16850 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
16860 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
16870 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
16880 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
16890 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
168a0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
168b0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
168c0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
168d0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
168e0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
168f0 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
16900 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
16910 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
16920 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
16930 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
16940 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
16950 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
16960 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
16970 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
16980 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
16990 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
169a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
169b0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
169c0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
169d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
169e0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
169f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16a00 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
16a10 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
16a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16a30 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
16a40 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
16a50 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
16a60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16a70 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
16a80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
16a90 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
16aa0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
16ab0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
16ac0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
16ad0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
16ae0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
16af0 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
16b00 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
16b10 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
16b20 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
16b30 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
16b40 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
16b50 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
16b60 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
16b70 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
16b80 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
16b90 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
16ba0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
16bb0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
16bc0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16bd0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
16be0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
16bf0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
16c00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
16c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16c20 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
16c30 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
16c40 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
16c50 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
16c60 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
16c70 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
16c80 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
16c90 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
16ca0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
16cb0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
16cc0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
16cd0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
16ce0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
16cf0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
16d00 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
16d10 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
16d20 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
16d30 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
16d40 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
16d50 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
16d60 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
16d70 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
16d80 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
16d90 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
16da0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
16db0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
16dc0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
16dd0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
16de0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
16df0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
16e00 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
16e10 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
16e20 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
16e30 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
16e40 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
16e50 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
16e60 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
16e70 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
16e80 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
16e90 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
16ea0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
16eb0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
16ec0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
16ed0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
16ee0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
16ef0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
16f00 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
16f10 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
16f20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
16f30 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
16f40 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
16f50 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
16f60 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
16f70 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
16f80 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
16f90 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
16fa0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
16fb0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
16fc0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
16fd0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
16fe0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
16ff0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
17000 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
17010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17020 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
17030 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
17040 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
17050 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
17060 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
17070 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
17080 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
17090 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
170a0 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
170b0 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
170c0 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
170d0 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
170e0 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
170f0 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
17100 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
17110 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
17120 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
17130 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
17140 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
17150 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
17160 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
17170 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
17180 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
17190 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
171a0 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
171b0 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
171c0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
171d0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
171e0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
171f0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
17200 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
17210 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
17220 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
17230 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
17240 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
17250 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
17260 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
17270 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
17280 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
17290 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
172a0 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
172b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
172c0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
172d0 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
172e0 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
172f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
17300 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
17310 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
17320 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
17330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
17340 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17350 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17360 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
17370 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
17380 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
17390 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
173a0 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
173b0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
173c0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
173d0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
173e0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
173f0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
17400 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
17410 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17420 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
17430 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
17440 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
17450 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
17460 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
17470 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
17480 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
17490 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
174a0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
174b0 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
174c0 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
174d0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
174e0 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
174f0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
17500 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
17510 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
17520 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
17530 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
17540 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
17550 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
17560 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
17570 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
17580 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
17590 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
175a0 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
175b0 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
175c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
175d0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
175e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
175f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
17600 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
17610 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
17620 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e  OSTRACE(("DIRSYN
17630 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c  C %-3d (have_ful
17640 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
17650 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
17660 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20  ->dirfd,.       
17670 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
17680 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
17690 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
176a0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
176b0 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  C.    /* The dir
176c0 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f  ectory sync is o
176d0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
176e0 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20   full_fsync is. 
176f0 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66     ** turned off
17700 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   or unavailable.
17710 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e    If a full_fsyn
17720 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  c occurred above
17730 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
17740 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
17750 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
17760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17770 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  (!HAVE_FULLFSYNC
17780 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29   || !isFullsync)
17790 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70   && full_fsync(p
177a0 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29  File->dirfd,0,0)
177b0 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20   ){.       /*.  
177c0 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
177d0 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
177e0 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79  e reports of fsy
177f0 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20  nc() returning. 
17800 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20        ** errors 
17810 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  when applied to 
17820 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63  directories on c
17830 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74  ertain file syst
17840 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41  ems..       ** A
17850 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72   failed director
17860 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20  y sync is not a 
17870 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74  big deal.  So it
17880 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a   seems.       **
17890 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72   better to ignor
178a0 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69  e the error.  Ti
178b0 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20  cket #1657.     
178c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70    */.       /* p
178d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
178e0 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20  = errno; */.    
178f0 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
17900 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
17910 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65    }.#endif.    e
17920 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
17930 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c  ->dirfd); /* Onl
17940 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
17950 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
17960 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72  e */.    if( err
17970 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
17980 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79      /* directory
17990 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
179a0 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  e */.      pFile
179b0 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
179c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
179d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
179e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
179f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
17a00 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
17a10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17a20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
17a30 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
17a40 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
17a50 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
17a60 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
17a70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17a80 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
17a90 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17aa0 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
17ab0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
17ac0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17ad0 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63  TRUNCATE );.  rc
17ae0 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75   = ftruncate(((u
17af0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
17b00 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
17b10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17b20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
17b30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17b40 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
17b50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
17b60 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  CATE;.  }else{.#
17b70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17b80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
17b90 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
17ba0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
17bb0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
17bc0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
17bd0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
17be0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
17bf0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
17c00 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
17c10 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
17c20 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
17c30 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
17c40 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
17c50 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
17c60 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
17c70 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
17c80 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
17c90 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
17ca0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
17cb0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
17cc0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
17cd0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
17ce0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
17cf0 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
17d00 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  f( ((unixFile*)i
17d10 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  d)->inNormalWrit
17d20 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
17d30 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
17d40 65 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43 6e 74  e*)id)->transCnt
17d50 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
17d60 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
17d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17d80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
17d90 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
17da0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
17db0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
17dc0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
17dd0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
17de0 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
17df0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
17e00 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
17e10 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
17e20 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
17e30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
17e40 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
17e50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
17e60 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
17e70 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
17e80 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
17e90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
17ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17eb0 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
17ec0 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
17ed0 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
17ee0 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
17ef0 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
17f00 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
17f10 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
17f20 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
17f30 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
17f40 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
17f50 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
17f60 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
17f70 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
17f80 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
17f90 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
17fa0 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
17fb0 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
17fc0 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
17fd0 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
17fe0 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
17ff0 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
18000 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
18010 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
18020 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
18030 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
18040 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18050 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
18060 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18070 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
18080 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
18090 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
180a0 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
180b0 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
180c0 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
180d0 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
180e0 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
180f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
18100 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
18110 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
18120 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
18130 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
18140 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
18150 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
18160 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
18170 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
18180 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
18190 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
181a0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
181b0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
181c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
181d0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
181e0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
181f0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
18200 64 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  d)->eFileLock;. 
18210 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18220 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18230 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
18240 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
18250 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
18260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18270 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
18280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18290 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
182a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
182b0 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 23 69 66 20  IZE_HINT: {.#if 
182c0 30 20 2f 2a 20 4e 6f 20 70 65 72 66 6f 72 6d 61  0 /* No performa
182d0 6e 63 65 20 61 64 76 61 6e 74 61 67 65 20 73 65  nce advantage se
182e0 65 6e 20 6f 6e 20 4c 69 6e 75 78 20 2a 2f 0a 20  en on Linux */. 
182f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
18300 36 34 20 73 7a 46 69 6c 65 20 3d 20 2a 28 73 71  64 szFile = *(sq
18310 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72  lite3_int64*)pAr
18320 67 3b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  g;.      unixFil
18330 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18340 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20  File*)id;.      
18350 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
18360 3e 68 2c 20 73 7a 46 69 6c 65 29 3b 0a 23 65 6e  >h, szFile);.#en
18370 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
18380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18390 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
183a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
183b0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
183c0 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
183d0 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
183e0 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
183f0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
18400 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
18410 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
18420 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
18430 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
18440 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18450 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
18460 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
18470 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
18480 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18490 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
184a0 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
184b0 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
184c0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
184d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
184f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18500 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
18510 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18520 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
18530 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
18540 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
18550 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
18560 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
18570 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
18580 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
18590 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
185a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
185b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
185c0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
185d0 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
185e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
185f0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
18600 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
18610 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
18620 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
18630 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
18640 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
18650 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
18660 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
18670 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
18680 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
18690 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
186a0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
186b0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
186c0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
186d0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
186e0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
186f0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
18700 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
18710 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
18720 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
18730 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
18740 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
18750 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
18760 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
18770 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
18780 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
18790 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
187a0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
187b0 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
187c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
187d0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
187e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
187f0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
18800 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18810 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
18820 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
18830 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
18840 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
18850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
18860 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
18870 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
18880 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
18890 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
188a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
188b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
188c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
188d0 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
188e0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
188f0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
18900 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
18910 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
18920 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
18930 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
18940 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
18950 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
18960 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
18970 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
18980 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
18990 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
189a0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
189b0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
189c0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
189d0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
189e0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
189f0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
18a00 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
18a10 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
18a20 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
18a30 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
18a40 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
18a50 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
18a60 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
18a70 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
18a80 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
18a90 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
18aa0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
18ab0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
18ac0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
18ad0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
18ae0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
18af0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
18b00 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
18b10 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
18b20 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
18b30 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
18b40 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
18b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
18b60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
18b70 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
18b80 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
18b90 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
18ba0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
18bb0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
18bc0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
18bd0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
18be0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
18bf0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
18c00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
18c10 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
18c20 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
18c30 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
18c40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18c50 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
18c60 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
18c70 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
18c80 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
18c90 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
18ca0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
18cb0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
18cc0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
18cd0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
18ce0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
18cf0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
18d00 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
18d10 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
18d20 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
18d30 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
18d40 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  cture..**.** To 
18d50 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c  avoid deadlocks,
18d60 20 6d 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78   mutex and mutex
18d70 42 75 66 20 61 72 65 20 61 6c 77 61 79 73 20 72  Buf are always r
18d80 65 6c 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a  eleased in the.*
18d90 2a 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  * reverse order 
18da0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 61 63  that they are ac
18db0 71 75 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75  quired.  mutexBu
18dc0 66 20 69 73 20 61 6c 77 61 79 73 20 61 63 71 75  f is always acqu
18dd0 69 72 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e  ired.** first an
18de0 64 20 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e  d released last.
18df0 20 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74    This invariant
18e00 20 69 73 20 63 68 65 63 6b 20 62 79 20 61 73 73   is check by ass
18e10 65 72 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  erting.** sqlite
18e20 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
18e30 29 20 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65  ) on mutex whene
18e40 76 65 72 20 6d 75 74 65 78 42 75 66 20 69 73 20  ver mutexBuf is 
18e50 61 63 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72  acquired or.** r
18e60 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75  eleased..*/.stru
18e70 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
18e80 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
18e90 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
18ea0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
18eb0 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
18ec0 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
18ed0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
18ee0 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
18ef0 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
18f00 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
18f10 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 42  e3_mutex *mutexB
18f20 75 66 3b 20 20 20 2f 2a 20 4d 75 74 65 78 20 74  uf;   /* Mutex t
18f30 6f 20 61 63 63 65 73 73 20 7a 42 75 66 5b 5d 20  o access zBuf[] 
18f40 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
18f50 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
18f60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
18f70 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
18f80 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
18f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18fa0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
18fb0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d  tor */.  int szM
18fc0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
18fd0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
18fe0 68 65 20 6d 61 70 70 69 6e 67 20 69 6e 74 6f 20  he mapping into 
18ff0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72  memory */.  char
19000 20 2a 70 4d 4d 61 70 42 75 66 3b 20 20 20 20 20   *pMMapBuf;     
19010 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19020 63 75 72 72 65 6e 74 6c 79 20 6d 6d 61 70 70 65  currently mmappe
19030 64 28 29 2e 20 20 4e 55 4c 4c 20 69 66 20 75 6e  d().  NULL if un
19040 6d 61 70 70 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mapped */.  int 
19050 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
19060 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19070 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
19080 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
19090 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
190a0 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
190b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
190c0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
190d0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
190e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
190f0 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
19100 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19110 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
19120 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
19130 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
19140 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
19150 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
19160 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
19170 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19190 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
191a0 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
191b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
191c0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
191d0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
191e0 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
191f0 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
19200 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
19210 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
19220 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
19230 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
19240 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
19250 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
19260 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
19270 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
19280 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
19290 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
192a0 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
192b0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
192c0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
192d0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
192e0 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
192f0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
19300 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
19310 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
19320 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
19330 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
19340 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
19350 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
19360 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
19370 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
19380 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
19390 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
193a0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
193b0 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
193c0 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
193d0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
193f0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
19400 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
19410 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20  e mutex */.  u8 
19420 68 61 73 4d 75 74 65 78 42 75 66 3b 20 20 20 20  hasMutexBuf;    
19430 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19440 69 66 20 68 6f 6c 64 69 6e 67 20 70 46 69 6c 65  if holding pFile
19450 2d 3e 6d 75 74 65 78 42 75 66 20 2a 2f 0a 20 20  ->mutexBuf */.  
19460 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
19470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
19480 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
19490 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
194a0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
194b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
194c0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
194d0 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
194e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
194f0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
19500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19510 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
19520 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
19530 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23  unixShmNode */.#
19540 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
19550 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
19560 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
19570 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
19580 41 53 45 20 20 20 20 20 20 38 30 20 20 20 20 20  ASE      80     
19590 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
195a0 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  t of the first l
195b0 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
195c0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
195d0 20 20 20 20 20 20 20 38 30 20 20 20 20 20 20 20         80       
195e0 20 2f 2a 20 54 68 65 20 64 65 61 64 6d 61 6e 20   /* The deadman 
195f0 73 77 69 74 63 68 20 6c 6f 63 6b 20 2a 2f 0a 0a  switch lock */..
19600 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19610 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
19620 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
19630 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
19640 74 72 69 6e 67 20 69 6e 20 73 74 61 74 69 63 20  tring in static 
19650 6d 65 6d 6f 72 79 20 74 68 61 74 0a 2a 2a 20 64  memory that.** d
19660 65 73 63 72 69 62 65 73 20 61 20 6c 6f 63 6b 69  escribes a locki
19670 6e 67 20 6d 61 73 6b 2e 20 20 54 68 65 20 73 74  ng mask.  The st
19680 72 69 6e 67 20 69 73 20 6f 66 20 74 68 65 20 66  ring is of the f
19690 6f 72 6d 20 22 4d 53 41 42 43 44 22 20 77 69 74  orm "MSABCD" wit
196a0 68 0a 2a 2a 20 65 61 63 68 20 63 68 61 72 61 63  h.** each charac
196b0 74 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ter representing
196c0 20 61 20 6c 6f 63 6b 2e 20 20 22 4d 22 20 66 6f   a lock.  "M" fo
196d0 72 20 4d 55 54 45 58 2c 20 22 53 22 20 66 6f 72  r MUTEX, "S" for
196e0 20 44 4d 53 2c 20 0a 2a 2a 20 61 6e 64 20 22 41   DMS, .** and "A
196f0 22 20 74 68 72 6f 75 67 68 20 22 44 22 20 66 6f  " through "D" fo
19700 72 20 74 68 65 20 72 65 67 69 6f 6e 20 6c 6f 63  r the region loc
19710 6b 73 2e 20 20 49 66 20 61 20 6c 6f 63 6b 20 69  ks.  If a lock i
19720 73 20 68 65 6c 64 2c 20 74 68 65 0a 2a 2a 20 6c  s held, the.** l
19730 65 74 74 65 72 20 69 73 20 73 68 6f 77 6e 2e 20  etter is shown. 
19740 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
19750 6e 6f 74 20 68 65 6c 64 2c 20 74 68 65 20 6c 65  not held, the le
19760 74 74 65 72 20 69 73 20 63 6f 6e 76 65 72 74 65  tter is converte
19770 64 0a 2a 2a 20 74 6f 20 22 2e 22 2e 0a 2a 2a 0a  d.** to "."..**.
19780 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19790 69 73 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  is for debugging
197a0 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20 61   purposes only a
197b0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
197c0 61 72 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75  ar.** in a produ
197d0 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ction build..*/.
197e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
197f0 72 20 2a 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74  r *unixShmLockSt
19800 72 69 6e 67 28 75 31 36 20 6d 61 73 6b 53 68 61  ring(u16 maskSha
19810 72 65 64 2c 20 75 31 36 20 6d 61 73 6b 45 78 63  red, u16 maskExc
19820 6c 75 73 69 76 65 29 7b 0a 20 20 73 74 61 74 69  lusive){.  stati
19830 63 20 63 68 61 72 20 7a 42 75 66 5b 35 32 5d 3b  c char zBuf[52];
19840 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 42  .  static int iB
19850 75 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  uf = 0;.  int i;
19860 0a 20 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 63  .  u16 mask;.  c
19870 68 61 72 20 2a 7a 3b 0a 0a 20 20 7a 20 3d 20 26  har *z;..  z = &
19880 7a 42 75 66 5b 69 42 75 66 5d 3b 0a 20 20 69 42  zBuf[iBuf];.  iB
19890 75 66 20 2b 3d 20 31 36 3b 0a 20 20 69 66 28 20  uf += 16;.  if( 
198a0 69 42 75 66 3e 3d 73 69 7a 65 6f 66 28 7a 42 75  iBuf>=sizeof(zBu
198b0 66 29 20 29 20 69 42 75 66 20 3d 20 30 3b 0a 20  f) ) iBuf = 0;. 
198c0 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
198d0 3b 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ; i<SQLITE_SHM_N
198e0 4c 4f 43 4b 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20  LOCK; i++, mask 
198f0 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66  += mask){.    if
19900 28 20 6d 61 73 6b 20 26 20 6d 61 73 6b 53 68 61  ( mask & maskSha
19910 72 65 64 20 29 7b 0a 20 20 20 20 20 20 7a 5b 69  red ){.      z[i
19920 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 65 6c  ] = 's';.    }el
19930 73 65 20 69 66 28 20 6d 61 73 6b 20 26 20 6d 61  se if( mask & ma
19940 73 6b 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  skExclusive ){. 
19950 20 20 20 20 20 7a 5b 69 5d 20 3d 20 27 45 27 3b       z[i] = 'E';
19960 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19970 20 20 7a 5b 69 5d 20 3d 20 27 2e 27 3b 0a 20 20    z[i] = '.';.  
19980 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 69 5d 20 3d    }.  }.  z[i] =
19990 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a   0;.  return z;.
199a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
199b0 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
199c0 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
199d0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
199e0 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
199f0 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
19a00 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
19a10 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
19a20 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
19a30 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
19a40 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
19a50 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
19a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19a70 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
19a80 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
19a90 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c  ShmNode, /* Appl
19aa0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
19ab0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
19ac0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
19ad0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
19ae0 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
19af0 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
19b00 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
19b10 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
19b20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
19b30 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
19b40 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
19b70 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
19b80 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
19b90 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  k f;       /* Th
19ba0 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
19bb0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
19bc0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
19bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
19be0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
19bf0 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
19c00 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
19c10 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
19c20 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
19c30 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
19c40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
19c50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19c60 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
19c70 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
19c80 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
19c90 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
19ca0 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
19cb0 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
19cc0 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
19cd0 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
19ce0 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
19cf0 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
19d00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
19d10 3d 31 20 26 26 20 6f 66 73 74 3e 3d 30 20 26 26  =1 && ofst>=0 &&
19d20 20 6f 66 73 74 2b 6e 3c 53 51 4c 49 54 45 5f 53   ofst+n<SQLITE_S
19d30 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  HM_NLOCK );..  /
19d40 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
19d50 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
19d60 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ers */.  memset(
19d70 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
19d80 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  );.  f.l_type = 
19d90 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c 5f  lockType;.  f.l_
19da0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
19db0 54 3b 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  T;.  f.l_start =
19dc0 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
19dd0 41 53 45 3b 0a 20 20 66 2e 6c 5f 6c 65 6e 20 3d  ASE;.  f.l_len =
19de0 20 6e 3b 0a 0a 20 20 72 63 20 3d 20 66 63 6e 74   n;..  rc = fcnt
19df0 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
19e00 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 72  _SETLK, &f);.  r
19e10 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
19e20 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
19e30 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f 2a 20  ITE_BUSY;..  /* 
19e40 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
19e50 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
19e60 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
19e70 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
19e80 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
19e90 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
19ea0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
19eb0 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
19ec0 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
19ed0 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
19ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19ef0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
19f00 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
19f10 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
19f20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
19f30 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
19f40 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
19f50 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
19f60 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
19f70 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
19f80 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
19f90 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
19fa0 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
19fb0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
19fc0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
19fd0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
19fe0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
19ff0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1a000 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1a010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1a020 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
1a030 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
1a040 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
1a050 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
1a060 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
1a070 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
1a080 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
1a090 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1a0a0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1a0b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1a0c0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
1a0d0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
1a0e0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
1a0f0 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
1a100 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1a110 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
1a120 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1a130 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
1a140 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
1a150 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1a160 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
1a170 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
1a180 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
1a190 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
1a1a0 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
1a1b0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
1a1c0 20 61 66 74 65 72 77 61 72 64 73 20 25 73 5c 6e   afterwards %s\n
1a1d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e  ",.           un
1a1e0 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28  ixShmLockString(
1a1f0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1a200 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
1a210 65 78 63 6c 4d 61 73 6b 29 29 29 3b 0a 20 20 7d  exclMask)));.  }
1a220 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1a230 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a  n rc;        .}.
1a240 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
1a250 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73  e unixShmNodeLis
1a260 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
1a270 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53  tries with unixS
1a280 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
1a290 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
1a2a0 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
1a2b0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
1a2c0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
1a2d0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
1a2e0 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
1a2f0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
1a300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
1a310 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46  ixShmPurge(unixF
1a320 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69  ile *pFd){.  uni
1a330 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46  xShmNode *p = pF
1a340 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
1a350 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
1a360 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
1a370 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
1a380 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
1a390 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65  ssert( p->pInode
1a3a0 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  ==pFd->pInode );
1a3b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65  .    if( p->mute
1a3c0 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x ) sqlite3_mute
1a3d0 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
1a3e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74  ;.    if( p->mut
1a3f0 65 78 42 75 66 20 29 20 73 71 6c 69 74 65 33 5f  exBuf ) sqlite3_
1a400 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1a410 74 65 78 42 75 66 29 3b 0a 20 20 20 20 69 66 28  texBuf);.    if(
1a420 20 70 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65   p->h>=0 ) close
1a430 28 70 2d 3e 68 29 3b 0a 20 20 20 20 70 2d 3e 70  (p->h);.    p->p
1a440 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
1a450 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
1a460 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
1a470 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
1a480 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1a490 2e 20 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  .  This particul
1a4a0 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
1a4b0 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70 70 65  n uses.** mmappe
1a4c0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 7a  d files..**.** z
1a4d0 4e 61 6d 65 20 69 73 20 61 20 66 69 6c 65 6e 61  Name is a filena
1a4e0 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74  me used to ident
1a4f0 69 66 79 20 74 68 65 20 73 68 61 72 65 64 2d 6d  ify the shared-m
1a500 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68 65  emory area.  The
1a510 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1a520 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e 64  on does not (and
1a530 20 70 65 72 68 61 70 73 20 73 68 6f 75 6c 64 20   perhaps should 
1a540 6e 6f 74 29 20 75 73 65 20 74 68 69 73 20 6e 61  not) use this na
1a550 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c 20  me.** directly, 
1a560 62 75 74 20 72 61 74 68 65 72 20 75 73 65 20 69  but rather use i
1a570 74 20 61 73 20 61 20 74 65 6d 70 6c 61 74 65 20  t as a template 
1a580 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e 20 61  for finding an a
1a590 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6e 61  ppropriate.** na
1a5a0 6d 65 20 66 6f 72 20 74 68 65 20 73 68 61 72 65  me for the share
1a5b0 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61 67 65  d-memory storage
1a5c0 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65  .  In this imple
1a5d0 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a  mentation, the.*
1a5e0 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e 64 65 78  * string "-index
1a5f0 22 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  " is appended to
1a600 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65 64 20   zName and used 
1a610 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  as the name of t
1a620 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66 69  he.** mmapped fi
1a630 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  le..**.** When o
1a640 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1a650 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1a660 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1a670 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1a680 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1a690 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1a6a0 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1a6b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1a6c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1a6d0 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1a6e0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1a6f0 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1a700 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1a710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a720 69 78 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71 6c  ixShmOpen(.  sql
1a730 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
1a740 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
1a750 65 73 63 72 69 70 74 6f 72 20 6f 66 20 74 68 65  escriptor of the
1a760 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
1a770 62 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  base */.){.  str
1a780 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
1a790 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a7a0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1a7b0 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
1a7c0 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  /.  struct unixS
1a7d0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1a7e0 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 75 6e   = 0;  /* The un
1a7f0 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
1a800 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
1a810 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a830 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1a840 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
1a850 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
1a860 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69       /* Underlyi
1a870 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1a880 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 3b   */.  int nPath;
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a8b0 20 6f 66 20 70 44 62 46 64 2d 3e 7a 50 61 74 68   of pDbFd->zPath
1a8c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1a8d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1a8e0 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71  e for the new sq
1a8f0 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74  lite3_shm object
1a900 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
1a910 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
1a920 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1a930 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1a940 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
1a950 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
1a960 6f 66 28 2a 70 29 29 3b 0a 20 20 70 44 62 46 64  of(*p));.  pDbFd
1a970 20 3d 20 28 73 74 72 75 63 74 20 75 6e 69 78 46   = (struct unixF
1a980 69 6c 65 2a 29 66 64 3b 0a 20 20 61 73 73 65 72  ile*)fd;.  asser
1a990 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
1a9a0 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
1a9b0 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
1a9c0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1a9d0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
1a9e0 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   Reuse an existi
1a9f0 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70  ng.  ** one if p
1aa00 72 65 73 65 6e 74 2e 20 20 43 72 65 61 74 65 20  resent.  Create 
1aa10 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
1aa20 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75  essary..  */.  u
1aa30 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1aa40 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 44  .  pShmNode = pD
1aa50 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
1aa60 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
1aa70 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
1aa80 6e 50 61 74 68 20 3d 20 73 74 72 6c 65 6e 28 70  nPath = strlen(p
1aa90 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1aaa0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
1aab0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
1aac0 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
1aad0 20 6e 50 61 74 68 20 2b 20 31 35 20 29 3b 0a 20   nPath + 15 );. 
1aae0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d     if( pShmNode=
1aaf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1ab00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ab10 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1ab20 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
1ab30 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
1ab40 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
1ab50 68 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 70 53  hmNode));.    pS
1ab60 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1ab70 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d  e = (char*)&pShm
1ab80 4e 6f 64 65 5b 31 5d 3b 0a 20 20 20 20 73 71 6c  Node[1];.    sql
1ab90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 50  ite3_snprintf(nP
1aba0 61 74 68 2b 31 35 2c 20 70 53 68 6d 4e 6f 64 65  ath+15, pShmNode
1abb0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ->zFilename,.   
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 20 20 22 25 73 2d 77 61 6c 2d 69 6e 64 65 78 22    "%s-wal-index"
1abe0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1abf0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
1ac00 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
1ac10 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1ac20 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
1ac30 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
1ac40 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
1ac50 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
1ac60 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
1ac70 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1ac80 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1ac90 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1aca0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1acb0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1acc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1acd0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1ace0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  r;.    }.    pSh
1acf0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 20  mNode->mutexBuf 
1ad00 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1ad10 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1ad20 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
1ad30 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1ad40 78 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xBuf==0 ){.     
1ad50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ad60 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1ad70 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1ad80 20 7d 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65   }..    pShmNode
1ad90 2d 3e 68 20 3d 20 6f 70 65 6e 28 70 53 68 6d 4e  ->h = open(pShmN
1ada0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1adb0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
1adc0 30 36 36 34 29 3b 0a 20 20 20 20 69 66 28 20 70  0664);.    if( p
1add0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a  ShmNode->h<0 ){.
1ade0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1adf0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
1ae00 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1ae10 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1ae20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1ae30 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1ae40 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1ae50 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1ae60 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
1ae70 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
1ae80 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1ae90 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
1aea0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1aeb0 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  _OK;.    if( uni
1aec0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1aed0 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
1aee0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1aef0 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1af00 0a 20 20 20 20 20 20 69 66 28 20 66 74 72 75 6e  .      if( ftrun
1af10 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
1af20 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1af30 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1af40 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
1af50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1af60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1af70 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
1af80 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1af90 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
1afa0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1afb0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
1afc0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1afd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1afe0 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
1aff0 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
1b000 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
1b010 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
1b020 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 70 2d  = pShmNode;.  p-
1b030 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
1b040 65 2d 3e 70 46 69 72 73 74 3b 0a 23 69 66 64 65  e->pFirst;.#ifde
1b050 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1b060 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
1b070 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
1b080 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
1b090 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1b0a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
1b0b0 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
1b0c0 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
1b0d0 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1b0e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1b0f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
1b100 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
1b110 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
1b120 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
1b130 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
1b140 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1b150 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1b160 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1b170 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
1b180 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
1b190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b1a0 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
1b1b0 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
1b1c0 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
1b1d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
1b1e0 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
1b1f0 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
1b200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1b210 69 78 53 68 6d 43 6c 6f 73 65 28 0a 20 20 73 71  ixShmClose(.  sq
1b220 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1b230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b240 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
1b250 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1b260 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
1b270 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1b280 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
1b290 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1b2a0 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
1b2b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1b2c0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1b2d0 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
1b2e0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1b2f0 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  e; /* The underl
1b300 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
1b310 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
1b320 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
1b330 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1b340 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
1b350 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
1b360 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
1b370 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75  ;       /* The u
1b380 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1b390 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
1b3a0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
1b3b0 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
1b3c0 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
1b3d0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b3e0 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
1b3f0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1b400 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
1b410 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
1b420 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
1b430 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1b440 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
1b450 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
1b460 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1b470 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62  the connection b
1b480 65 69 6e 67 20 63 6c 6f 73 65 64 20 68 6f 6c 64  eing closed hold
1b490 73 20 6e 6f 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  s no locks */.  
1b4a0 61 73 73 65 72 74 28 20 70 2d 3e 65 78 63 6c 4d  assert( p->exclM
1b4b0 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ask==0 );.  asse
1b4c0 72 74 28 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  rt( p->sharedMas
1b4d0 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  k==0 );..  /* Re
1b4e0 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
1b4f0 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
1b500 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
1b510 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
1b520 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
1b530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1b540 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1b550 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
1b560 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
1b570 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
1b580 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
1b590 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
1b5a0 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
1b5b0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
1b5c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1b5d0 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
1b5e0 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
1b5f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b600 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1b610 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
1b620 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
1b630 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
1b640 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
1b650 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
1b660 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
1b670 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
1b680 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1b690 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1b6a0 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1b6b0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1b6c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1b6d0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65   ){.    if( dele
1b6e0 74 65 46 6c 61 67 20 29 20 75 6e 6c 69 6e 6b 28  teFlag ) unlink(
1b6f0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1b700 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68  ame);.    unixSh
1b710 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20  mPurge(pDbFd);. 
1b720 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
1b730 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1b740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b750 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 74 68 65  *.** Changes the
1b760 20 73 69 7a 65 20 6f 66 20 74 68 65 20 75 6e 64   size of the und
1b770 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 20  erlying storage 
1b780 66 6f 72 20 20 61 20 73 68 61 72 65 64 2d 6d 65  for  a shared-me
1b790 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a  mory segment..**
1b7a0 0a 2a 2a 20 54 68 65 20 72 65 71 53 69 7a 65 20  .** The reqSize 
1b7b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1b7c0 20 6e 65 77 20 72 65 71 75 65 73 74 65 64 20 73   new requested s
1b7d0 69 7a 65 20 6f 66 20 74 68 65 20 73 68 61 72 65  ize of the share
1b7e0 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 69  d memory..** Thi
1b7f0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
1b800 20 69 73 20 66 72 65 65 20 74 6f 20 69 6e 63 72   is free to incr
1b810 65 61 73 65 20 74 68 65 20 73 68 61 72 65 64 20  ease the shared 
1b820 6d 65 6d 6f 72 79 20 73 69 7a 65 20 74 6f 0a 2a  memory size to.*
1b830 2a 20 61 6e 79 20 61 6d 6f 75 6e 74 20 67 72 65  * any amount gre
1b840 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1b850 61 6c 20 74 6f 20 72 65 71 53 69 7a 65 2e 20 20  al to reqSize.  
1b860 49 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  If the shared me
1b870 6d 6f 72 79 20 69 73 0a 2a 2a 20 61 6c 72 65 61  mory is.** alrea
1b880 64 79 20 61 73 20 62 69 67 20 6f 72 20 62 69 67  dy as big or big
1b890 67 65 72 20 61 73 20 72 65 71 53 69 7a 65 2c 20  ger as reqSize, 
1b8a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b8b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
1b8c0 68 65 20 72 65 71 53 69 7a 65 20 70 61 72 61 6d  he reqSize param
1b8d0 65 74 65 72 20 69 73 20 74 68 65 20 6d 69 6e 69  eter is the mini
1b8e0 6d 75 6d 20 73 69 7a 65 20 72 65 71 75 65 73 74  mum size request
1b8f0 65 64 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65  ed.  The impleme
1b900 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 66 72  ntation.** is fr
1b910 65 65 20 74 6f 20 65 78 70 61 6e 64 20 74 68 65  ee to expand the
1b920 20 73 74 6f 72 61 67 65 20 74 6f 20 73 6f 6d 65   storage to some
1b930 20 6c 61 72 67 65 72 20 61 6d 6f 75 6e 74 20 69   larger amount i
1b940 66 20 69 74 20 63 68 6f 6f 73 65 73 2e 0a 2a 2f  f it chooses..*/
1b950 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1b960 53 68 6d 53 69 7a 65 28 0a 20 20 73 71 6c 69 74  ShmSize(.  sqlit
1b970 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1b980 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e       /* The open
1b990 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1b9a0 6f 6c 64 69 6e 67 20 53 48 4d 20 2a 2f 0a 20 20  olding SHM */.  
1b9b0 69 6e 74 20 72 65 71 53 69 7a 65 2c 20 20 20 20  int reqSize,    
1b9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1b9d0 75 65 73 74 65 64 20 73 69 7a 65 2e 20 20 2d 31  uested size.  -1
1b9e0 20 66 6f 72 20 71 75 65 72 79 20 6f 6e 6c 79 20   for query only 
1b9f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 65 77 53 69  */.  int *pNewSi
1ba00 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze             /
1ba10 2a 20 57 72 69 74 65 20 6e 65 77 20 73 69 7a 65  * Write new size
1ba20 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   here */.){.  un
1ba30 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
1ba40 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
1ba50 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
1ba60 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e 69  bFd->pShm;.  uni
1ba70 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1ba80 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1ba90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1baa0 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74  ITE_OK;.  struct
1bab0 20 73 74 61 74 20 73 53 74 61 74 3b 0a 0a 20 20   stat sStat;..  
1bac0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1bad0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
1bae0 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
1baf0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
1bb00 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
1bb10 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 77 68 69  pInode );..  whi
1bb20 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
1bb30 20 66 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d   fstat(pShmNode-
1bb40 3e 68 2c 20 26 73 53 74 61 74 29 3d 3d 30 20 29  >h, &sStat)==0 )
1bb50 7b 0a 20 20 20 20 20 20 2a 70 4e 65 77 53 69 7a  {.      *pNewSiz
1bb60 65 20 3d 20 28 69 6e 74 29 73 53 74 61 74 2e 73  e = (int)sStat.s
1bb70 74 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  t_size;.      if
1bb80 28 20 72 65 71 53 69 7a 65 3c 3d 28 69 6e 74 29  ( reqSize<=(int)
1bb90 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 29 20  sStat.st_size ) 
1bba0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
1bbb0 7b 0a 20 20 20 20 20 20 2a 70 4e 65 77 53 69 7a  {.      *pNewSiz
1bbc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1bbd0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
1bbe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bbf0 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 72 75   }.    rc = ftru
1bc00 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
1bc10 68 2c 20 72 65 71 53 69 7a 65 29 3b 0a 20 20 20  h, reqSize);.   
1bc20 20 72 65 71 53 69 7a 65 20 3d 20 2d 31 3b 0a 20   reqSize = -1;. 
1bc30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1bc40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 20 74 68  }.../*.** Map th
1bc50 65 20 73 68 61 72 65 64 20 73 74 6f 72 61 67 65  e shared storage
1bc60 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 0a 2a   into memory. .*
1bc70 2a 0a 2a 2a 20 49 66 20 72 65 71 4d 61 70 53 69  *.** If reqMapSi
1bc80 7a 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  ze is positive, 
1bc90 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
1bca0 69 73 20 6d 61 64 65 20 74 6f 20 6d 61 6b 65 20  is made to make 
1bcb0 74 68 65 0a 2a 2a 20 6d 61 70 70 69 6e 67 20 61  the.** mapping a
1bcc0 74 20 6c 65 61 73 74 20 72 65 71 4d 61 70 53 69  t least reqMapSi
1bcd0 7a 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ze bytes in size
1bce0 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  .  However, the 
1bcf0 6d 61 70 70 69 6e 67 0a 2a 2a 20 77 69 6c 6c 20  mapping.** will 
1bd00 6e 65 76 65 72 20 62 65 20 6c 61 72 67 65 72 20  never be larger 
1bd10 74 68 61 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  than the size of
1bd20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1bd30 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  shared memory.**
1bd40 20 61 73 20 73 65 74 20 62 79 20 70 72 69 6f 72   as set by prior
1bd50 20 63 61 6c 6c 73 20 74 6f 20 78 53 68 6d 53 69   calls to xShmSi
1bd60 7a 65 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 2a 70  ze().  .**.** *p
1bd70 70 42 75 66 20 69 73 20 6d 61 64 65 20 74 6f 20  pBuf is made to 
1bd80 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 65 6d  point to the mem
1bd90 6f 72 79 20 77 68 69 63 68 20 69 73 20 61 20 6d  ory which is a m
1bda0 61 70 70 69 6e 67 20 6f 66 20 74 68 65 0a 2a 2a  apping of the.**
1bdb0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72   underlying stor
1bdc0 61 67 65 2e 20 20 41 20 6d 75 74 65 78 20 69 73  age.  A mutex is
1bdd0 20 61 63 71 75 69 72 65 64 20 74 6f 20 70 72 65   acquired to pre
1bde0 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72 65 61  vent other threa
1bdf0 64 73 0a 2a 2a 20 66 72 6f 6d 20 72 75 6e 6e 69  ds.** from runni
1be00 6e 67 20 77 68 69 6c 65 20 2a 70 70 42 75 66 20  ng while *ppBuf 
1be10 69 73 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  is in use in ord
1be20 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 74  er to prevent ot
1be30 68 65 72 20 74 68 72 65 61 64 73 0a 2a 2a 20 72  her threads.** r
1be40 65 6d 61 70 70 69 6e 67 20 2a 70 70 42 75 66 20  emapping *ppBuf 
1be50 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
1be60 68 69 73 20 74 68 72 65 61 64 2e 20 20 54 68 65  his thread.  The
1be70 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 28   unixShmRelease(
1be80 29 0a 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 72  ).** call will r
1be90 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
1bea0 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  .  However, if t
1beb0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 69 73  he lock state is
1bec0 20 43 48 45 43 4b 50 4f 49 4e 54 2c 0a 2a 2a 20   CHECKPOINT,.** 
1bed0 74 68 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74  the mutex is not
1bee0 20 61 63 71 75 69 72 65 64 20 62 65 63 61 75 73   acquired becaus
1bef0 65 20 43 48 45 43 4b 50 4f 49 4e 54 20 77 69 6c  e CHECKPOINT wil
1bf00 6c 20 6e 65 76 65 72 20 72 65 6d 61 70 20 74 68  l never remap th
1bf10 65 0a 2a 2a 20 62 75 66 66 65 72 2e 20 20 52 45  e.** buffer.  RE
1bf20 43 4f 56 45 52 20 6d 69 67 68 74 20 72 65 6d 61  COVER might rema
1bf30 70 2c 20 74 68 6f 75 67 68 2c 20 73 6f 20 43 48  p, though, so CH
1bf40 45 43 4b 50 4f 49 4e 54 20 77 69 6c 6c 20 61 63  ECKPOINT will ac
1bf50 71 75 69 72 65 0a 2a 2a 20 74 68 65 20 6d 75 74  quire.** the mut
1bf60 65 78 20 69 66 20 61 6e 64 20 77 68 65 6e 20 69  ex if and when i
1bf70 74 20 70 72 6f 6d 6f 74 65 73 20 74 6f 20 52 45  t promotes to RE
1bf80 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20 52 45 43  COVER..**.** REC
1bf90 4f 56 45 52 20 6e 65 65 64 73 20 74 6f 20 62 65  OVER needs to be
1bfa0 20 61 74 6f 6d 69 63 2e 20 20 54 68 65 20 73 61   atomic.  The sa
1bfb0 6d 65 20 6d 75 74 65 78 20 74 68 61 74 20 70 72  me mutex that pr
1bfc0 65 76 65 6e 74 73 20 2a 70 70 42 75 66 20 66 72  events *ppBuf fr
1bfd0 6f 6d 0a 2a 2a 20 62 65 69 6e 67 20 72 65 6d 61  om.** being rema
1bfe0 70 70 65 64 20 61 6c 73 6f 20 70 72 65 76 65 6e  pped also preven
1bff0 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
1c000 20 74 68 72 65 61 64 20 66 72 6f 6d 20 62 65 69   thread from bei
1c010 6e 67 20 69 6e 0a 2a 2a 20 52 45 43 4f 56 45 52  ng in.** RECOVER
1c020 20 61 74 20 61 20 74 69 6d 65 2e 20 20 42 75 74   at a time.  But
1c030 2c 20 52 45 43 4f 56 45 52 20 73 6f 6d 65 74 69  , RECOVER someti
1c040 6d 65 73 20 77 61 6e 74 73 20 74 6f 20 72 65 6d  mes wants to rem
1c050 61 70 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 54 6f  ap itself..** To
1c060 20 70 72 65 76 65 6e 74 20 52 45 43 4f 56 45 52   prevent RECOVER
1c070 20 66 72 6f 6d 20 6c 6f 73 69 6e 67 20 69 74 73   from losing its
1c080 20 6c 6f 63 6b 20 77 68 69 6c 65 20 72 65 6d 61   lock while rema
1c090 70 70 69 6e 67 2c 20 74 68 65 0a 2a 2a 20 6d 75  pping, the.** mu
1c0a0 74 65 78 20 69 73 20 6e 6f 74 20 72 65 6c 65 61  tex is not relea
1c0b0 73 65 64 20 62 79 20 75 6e 69 78 53 68 6d 52 65  sed by unixShmRe
1c0c0 6c 65 61 73 65 28 29 20 77 68 65 6e 20 69 6e 20  lease() when in 
1c0d0 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20 2a  RECOVER..**.** *
1c0e0 70 4e 65 77 4d 61 70 53 69 7a 65 20 69 73 20 73  pNewMapSize is s
1c0f0 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
1c100 66 20 74 68 65 20 6d 61 70 70 69 6e 67 2e 20 20  f the mapping.  
1c110 55 73 75 61 6c 6c 79 20 2a 70 4e 65 77 4d 61 70  Usually *pNewMap
1c120 53 69 7a 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  Size.** will be 
1c130 72 65 71 4d 61 70 53 69 7a 65 20 6f 72 20 6c 61  reqMapSize or la
1c140 72 67 65 72 2c 20 74 68 6f 75 67 68 20 69 74 20  rger, though it 
1c150 63 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c 65 72  could be smaller
1c160 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72   if the.** under
1c170 6c 79 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lying shared mem
1c180 6f 72 79 20 68 61 73 20 6e 65 76 65 72 20 62 65  ory has never be
1c190 65 6e 20 65 6e 6c 61 72 67 65 64 20 74 6f 20 72  en enlarged to r
1c1a0 65 71 4d 61 70 53 69 7a 65 20 62 79 74 65 73 0a  eqMapSize bytes.
1c1b0 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c  ** by prior call
1c1c0 73 20 74 6f 20 78 53 68 6d 53 69 7a 65 28 29 2e  s to xShmSize().
1c1d0 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66 20 6d 69  .**.** *ppBuf mi
1c1e0 67 68 74 20 62 65 20 4e 55 4c 4c 20 61 6e 64 20  ght be NULL and 
1c1f0 7a 65 72 6f 20 69 66 20 6e 6f 20 73 70 61 63 65  zero if no space
1c200 20 68 61 73 0a 2a 2a 20 79 65 74 20 62 65 65 6e   has.** yet been
1c210 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 74 68   allocated to th
1c220 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f  e underlying sto
1c230 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rage..*/.static 
1c240 69 6e 74 20 75 6e 69 78 53 68 6d 47 65 74 28 0a  int unixShmGet(.
1c250 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1c260 66 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  fd,        /* Da
1c270 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
1c280 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
1c290 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 71 4d 61  y */.  int reqMa
1c2a0 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
1c2b0 2f 2a 20 52 65 71 75 65 73 74 65 64 20 73 69 7a  /* Requested siz
1c2c0 65 20 6f 66 20 6d 61 70 70 69 6e 67 2e 20 2d 31  e of mapping. -1
1c2d0 20 6d 65 61 6e 73 20 64 6f 6e 27 74 20 63 61 72   means don't car
1c2e0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 65 77  e */.  int *pNew
1c2f0 4d 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20  MapSize,        
1c300 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 73 69 7a  /* Write new siz
1c310 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 68 65 72  e of mapping her
1c320 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  e */.  void vola
1c330 74 69 6c 65 20 2a 2a 70 70 42 75 66 20 20 20 20  tile **ppBuf    
1c340 2f 2a 20 57 72 69 74 65 20 6d 61 70 70 69 6e 67  /* Write mapping
1c350 20 62 75 66 66 65 72 20 6f 72 69 67 69 6e 20 68   buffer origin h
1c360 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ere */.){.  unix
1c370 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
1c380 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
1c390 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
1c3a0 64 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e 69 78 53  d->pShm;.  unixS
1c3b0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1c3c0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
1c3d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c3e0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1c3f0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
1c400 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1c410 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
1c420 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
1c430 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
1c440 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 68 61 73  );..  if( p->has
1c450 4d 75 74 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20  MutexBuf==0 ){. 
1c460 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1c470 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
1c480 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c490 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1c4a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1c4b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 29  mNode->mutexBuf)
1c4c0 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75 74 65  ;.    p->hasMute
1c4d0 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  xBuf = 1;.  }.  
1c4e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c4f0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1c500 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68 6d  tex);.  if( pShm
1c510 4e 6f 64 65 2d 3e 73 7a 4d 61 70 3d 3d 30 20 7c  Node->szMap==0 |
1c520 7c 20 72 65 71 4d 61 70 53 69 7a 65 3e 70 53 68  | reqMapSize>pSh
1c530 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20 29 7b 0a  mNode->szMap ){.
1c540 20 20 20 20 69 6e 74 20 61 63 74 75 61 6c 53 69      int actualSi
1c550 7a 65 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ze;.    if( unix
1c560 53 68 6d 53 69 7a 65 28 66 64 2c 20 2d 31 2c 20  ShmSize(fd, -1, 
1c570 26 61 63 74 75 61 6c 53 69 7a 65 29 21 3d 53 51  &actualSize)!=SQ
1c580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c590 20 61 63 74 75 61 6c 53 69 7a 65 20 3d 20 30 3b   actualSize = 0;
1c5a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 71 4d 61  .    }.    reqMa
1c5b0 70 53 69 7a 65 20 3d 20 61 63 74 75 61 6c 53 69  pSize = actualSi
1c5c0 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  ze;.    if( pShm
1c5d0 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20 7c  Node->pMMapBuf |
1c5e0 7c 20 72 65 71 4d 61 70 53 69 7a 65 3c 3d 30 20  | reqMapSize<=0 
1c5f0 29 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70 28  ){.      munmap(
1c600 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42  pShmNode->pMMapB
1c610 75 66 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  uf, pShmNode->sz
1c620 4d 61 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Map);.    }.    
1c630 69 66 28 20 72 65 71 4d 61 70 53 69 7a 65 3e 30  if( reqMapSize>0
1c640 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   ){.      pShmNo
1c650 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3d 20 6d  de->pMMapBuf = m
1c660 6d 61 70 28 30 2c 20 72 65 71 4d 61 70 53 69 7a  map(0, reqMapSiz
1c670 65 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f  e, PROT_READ|PRO
1c680 54 5f 57 52 49 54 45 2c 20 4d 41 50 5f 53 48 41  T_WRITE, MAP_SHA
1c690 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RED,.           
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30    pShmNode->h, 0
1c6c0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
1c6d0 65 2d 3e 73 7a 4d 61 70 20 3d 20 70 53 68 6d 4e  e->szMap = pShmN
1c6e0 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3f 20  ode->pMMapBuf ? 
1c6f0 72 65 71 4d 61 70 53 69 7a 65 20 3a 20 30 3b 0a  reqMapSize : 0;.
1c700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c710 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70   pShmNode->pMMap
1c720 42 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Buf = 0;.      p
1c730 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20 3d  ShmNode->szMap =
1c740 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1c750 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 3d 20 70  *pNewMapSize = p
1c760 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 3b 0a  ShmNode->szMap;.
1c770 20 20 2a 70 70 42 75 66 20 3d 20 70 53 68 6d 4e    *ppBuf = pShmN
1c780 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66 3b 0a 20  ode->pMMapBuf;. 
1c790 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c7a0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1c7b0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c7c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
1c7d0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 68 65  ease the lock he
1c7e0 6c 64 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ld on the shared
1c7f0 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
1c800 74 6f 20 74 68 61 74 20 6f 74 68 65 72 0a 2a 2a  to that other.**
1c810 20 74 68 72 65 61 64 73 20 61 72 65 20 66 72 65   threads are fre
1c820 65 20 74 6f 20 72 65 73 69 7a 65 20 69 74 20 69  e to resize it i
1c830 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
1c840 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  ** If the lock i
1c850 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
1c860 68 65 6c 64 2c 20 74 68 69 73 20 72 6f 75 74 69  held, this routi
1c870 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
1c880 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1c890 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1c8a0 72 79 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 20  ry object is in 
1c8b0 6c 6f 63 6b 20 73 74 61 74 65 20 52 45 43 4f 56  lock state RECOV
1c8c0 45 52 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 6e  ER, then we do n
1c8d0 6f 74 0a 2a 2a 20 72 65 61 6c 6c 79 20 77 61 6e  ot.** really wan
1c8e0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  t to release the
1c8f0 20 6c 6f 63 6b 2c 20 73 6f 20 69 6e 20 74 68 61   lock, so in tha
1c900 74 20 63 61 73 65 20 74 6f 6f 2c 20 74 68 69 73  t case too, this
1c910 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61   routine.** is a
1c920 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1c930 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 6c  c int unixShmRel
1c940 65 61 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  ease(sqlite3_fil
1c950 65 20 2a 66 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *fd){.  unixFi
1c960 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
1c970 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
1c980 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  xShm *p = pDbFd-
1c990 3e 70 53 68 6d 3b 0a 0a 20 20 69 66 28 20 70 2d  >pShm;..  if( p-
1c9a0 3e 68 61 73 4d 75 74 65 78 42 75 66 20 29 7b 0a  >hasMutexBuf ){.
1c9b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1c9c0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
1c9d0 64 28 70 2d 3e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  d(p->pShmNode->m
1c9e0 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
1c9f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ca00 28 70 2d 3e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  (p->pShmNode->mu
1ca10 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e  texBuf);.    p->
1ca20 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 30 3b  hasMutexBuf = 0;
1ca30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ca40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1ca50 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
1ca60 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
1ca70 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1ca80 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1ca90 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
1caa0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1cab0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1cac0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
1cad0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1cae0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1caf0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1cb00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1cb10 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
1cb20 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1cb30 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb50 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
1cb60 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1cb70 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
1cb80 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1cb90 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1cba0 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
1cbb0 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
1cbc0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
1cbd0 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
1cbe0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
1cbf0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1cc00 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
1cc10 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1cc20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
1cc30 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
1cc40 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
1cc50 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1cc60 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1cc80 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1cc90 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
1cca0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1ccb0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1ccc0 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
1ccd0 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
1cce0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
1ccf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1cd20 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1cd50 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
1cd60 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
1cd70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
1cd80 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
1cd90 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
1cda0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1cdb0 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
1cdc0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
1cdd0 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
1cde0 26 26 20 6f 66 73 74 2b 6e 3c 53 51 4c 49 54 45  && ofst+n<SQLITE
1cdf0 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
1ce00 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
1ce10 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
1ce20 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1ce30 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1ce40 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1ce50 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1ce60 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1ce70 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1ce80 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1ce90 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1cea0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1ceb0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1cec0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1ced0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1cee0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1cef0 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
1cf00 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
1cf10 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
1cf20 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
1cf30 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
1cf40 66 73 74 2b 6e 2b 31 29 29 20 2d 20 28 31 3c 3c  fst+n+1)) - (1<<
1cf50 28 6f 66 73 74 2b 31 29 29 3b 0a 20 20 61 73 73  (ofst+1));.  ass
1cf60 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
1cf70 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
1cf80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1cf90 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1cfa0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
1cfb0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1cfc0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
1cfd0 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
1cfe0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1cff0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
1d000 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
1d010 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
1d020 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
1d030 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
1d040 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1d050 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1d060 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1d070 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
1d080 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1d090 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1d0a0 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
1d0b0 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
1d0c0 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
1d0d0 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
1d0e0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1d0f0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
1d100 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
1d110 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
1d120 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
1d130 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
1d140 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
1d150 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
1d160 4b 2c 20 6f 66 73 74 2b 31 2c 20 6e 29 3b 0a 20  K, ofst+1, n);. 
1d170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d190 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1d1a0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
1d1b0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1d1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d1d0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1d1e0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1d1f0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
1d200 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
1d210 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
1d220 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
1d230 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
1d240 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
1d250 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
1d260 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
1d270 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
1d280 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
1d290 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
1d2a0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
1d2b0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
1d2c0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1d2d0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
1d2e0 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
1d2f0 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
1d300 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
1d310 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
1d320 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
1d330 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
1d340 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1d350 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1d360 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1d370 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
1d380 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1d390 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1d3a0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1d3b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d3c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1d3d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1d3e0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
1d3f0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1d400 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d410 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
1d420 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
1d430 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
1d440 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
1d450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d460 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
1d470 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
1d480 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
1d490 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1d4a0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
1d4b0 43 4b 2c 20 6f 66 73 74 2b 31 2c 20 6e 29 3b 0a  CK, ofst+1, n);.
1d4c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d4d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d4e0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1d4f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1d500 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
1d510 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1d520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d530 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
1d540 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1d550 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1d560 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1d570 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1d580 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1d590 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1d5a0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
1d5b0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
1d5c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1d5d0 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
1d5e0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1d5f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1d600 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1d610 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
1d620 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
1d630 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1d640 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1d650 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
1d660 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
1d670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1d680 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1d690 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d6a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1d6b0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
1d6c0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
1d6d0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
1d6e0 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
1d6f0 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
1d700 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
1d710 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
1d720 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
1d730 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1d740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d750 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
1d760 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1d770 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
1d780 73 74 2b 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20  st+1, n);.      
1d790 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d7a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
1d7b0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1d7c0 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ask;.        p->
1d7d0 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
1d7e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d7f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1d800 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1d810 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
1d820 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1d830 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
1d840 64 20 67 6f 74 20 25 73 5c 6e 22 2c 0a 20 20 20  d got %s\n",.   
1d850 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
1d860 65 74 70 69 64 28 29 2c 20 75 6e 69 78 53 68 6d  etpid(), unixShm
1d870 4c 6f 63 6b 53 74 72 69 6e 67 28 70 2d 3e 73 68  LockString(p->sh
1d880 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1d890 6c 4d 61 73 6b 29 29 29 3b 0a 20 20 72 65 74 75  lMask)));.  retu
1d8a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d8b0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
1d8c0 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
1d8d0 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
1d8e0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
1d8f0 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
1d900 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
1d910 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
1d920 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
1d930 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
1d940 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
1d950 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
1d960 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
1d970 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72  void unixShmBarr
1d980 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
1d990 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
1d9a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1d9b0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
1d9c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1d9d0 29 7b 0a 23 69 66 64 65 66 20 5f 5f 47 4e 55 43  ){.#ifdef __GNUC
1d9e0 5f 5f 0a 20 20 5f 5f 73 79 6e 63 5f 73 79 6e 63  __.  __sync_sync
1d9f0 68 72 6f 6e 69 7a 65 28 29 3b 0a 23 65 6c 73 65  hronize();.#else
1da00 0a 20 20 75 6e 69 78 4d 75 74 65 78 45 6e 74 65  .  unixMutexEnte
1da10 72 28 29 3b 0a 20 20 75 6e 69 78 4d 75 74 65 78  r();.  unixMutex
1da20 4c 65 61 76 65 28 29 3b 0a 23 65 6e 64 69 66 0a  Leave();.#endif.
1da30 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
1da40 6e 65 20 75 6e 69 78 53 68 6d 4f 70 65 6e 20 20  ne unixShmOpen  
1da50 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
1da60 78 53 68 6d 53 69 7a 65 20 20 20 20 30 0a 23 20  xShmSize    0.# 
1da70 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 47 65  define unixShmGe
1da80 74 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  t     0.# define
1da90 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 20   unixShmRelease 
1daa0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
1dab0 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
1dac0 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72  fine unixShmBarr
1dad0 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ier 0.# define u
1dae0 6e 69 78 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a  nixShmClose   0.
1daf0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
1db00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1db10 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  L */../*.** Here
1db20 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1db30 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1db40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1db50 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1db60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1db70 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1db80 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1db90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dba0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1dbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbf0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1dc00 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
1dc10 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
1dc20 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
1dc30 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
1dc40 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
1dc50 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
1dc60 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
1dc70 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
1dc80 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
1dc90 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
1dca0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
1dcb0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
1dcc0 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
1dcd0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
1dce0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
1dcf0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
1dd00 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
1dd10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
1dd20 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
1dd30 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
1dd40 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
1dd50 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
1dd60 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
1dd70 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
1dd80 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
1dd90 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
1dda0 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
1ddb0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
1ddc0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1ddd0 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
1dde0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
1ddf0 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
1de00 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
1de10 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
1de20 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
1de30 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
1de40 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
1de50 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
1de60 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
1de70 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
1de80 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
1de90 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
1dea0 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
1deb0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
1dec0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
1ded0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
1dee0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
1def0 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
1df00 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
1df10 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
1df20 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1df30 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
1df40 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
1df50 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
1df60 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
1df70 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
1df80 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
1df90 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
1dfa0 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
1dfb0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
1dfc0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
1dfd0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
1dfe0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
1dff0 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
1e000 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
1e010 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
1e020 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
1e030 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
1e040 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
1e050 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
1e060 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
1e070 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
1e080 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
1e090 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1e0a0 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
1e0b0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
1e0c0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
1e0d0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
1e0e0 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
1e0f0 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
1e100 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
1e110 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
1e120 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
1e130 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
1e140 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
1e150 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
1e160 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
1e170 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
1e180 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
1e190 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49  R, METHOD, VERSI
1e1a0 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ON, CLOSE, LOCK,
1e1b0 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
1e1c0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
1e1d0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1e1e0 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
1e1f0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
1e220 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
1e230 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1e240 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
1e290 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
1e2c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e2d0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
1e310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e320 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
1e360 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1e370 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
1e380 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e3f0 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
1e400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e410 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1e440 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e460 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e490 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4b0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e4e0 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e500 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1e510 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
1e520 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1e530 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
1e540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e550 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1e580 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
1e590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e5a0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1e5d0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1e5e0 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
1e5f0 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
1e600 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1e610 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1e620 78 53 68 6d 4f 70 65 6e 2c 20 20 20 20 20 20 20  xShmOpen,       
1e630 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1e640 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1e670 53 68 6d 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ShmSize,        
1e680 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 53          /* xShmS
1e690 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1e6c0 68 6d 47 65 74 2c 20 20 20 20 20 20 20 20 20 20  hmGet,          
1e6d0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 47 65         /* xShmGe
1e6e0 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  t */            
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
1e710 6d 52 65 6c 65 61 73 65 2c 20 20 20 20 20 20 20  mRelease,       
1e720 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 52 65 6c        /* xShmRel
1e730 65 61 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  ease */         
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
1e760 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1e770 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
1e780 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42     \.   unixShmB
1e7b0 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
1e7c0 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
1e7d0 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  er */           
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 43 6c    \.   unixShmCl
1e800 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
1e810 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f 73 65 20     /* xShmClose 
1e820 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
1e8a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1e8b0 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
1e8c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
1e8d0 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
1e8e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e8f0 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
1e900 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1e930 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
1e940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
1e9d0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1e9e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
1e9f0 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
1ea00 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
1ea10 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
1ea20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
1ea30 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
1ea40 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
1ea50 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1ea60 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
1ea70 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
1ea80 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
1ea90 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
1eaa0 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
1eab0 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
1eac0 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
1ead0 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
1eae0 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
1eaf0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
1eb00 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1eb10 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
1eb20 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1eb30 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1eb40 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1eb50 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20  t name */.  2,  
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e        /* ShmOpen
1eb80 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
1eb90 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
1eba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1ebb0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1ebc0 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
1ebd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1ebe0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1ebf0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
1ec00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1ec10 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1ec20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
1ec30 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43  edLock     /* xC
1ec40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1ec50 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
1ec60 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
1ec70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1ec80 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1ec90 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1eca0 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
1ecb0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
1ecc0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1ecd0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
1ece0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ed00 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c  hmOpen is disabl
1ed10 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
1ed20 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1ed30 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
1ed40 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
1ed50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1ed60 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
1ed70 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
1ed80 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1ed90 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
1eda0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
1edb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1edc0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1edd0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
1ede0 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
1edf0 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
1ee00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
1ee10 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1ee20 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49  me */.  dotlockI
1ee30 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1ee40 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1ee50 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1ee60 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73     /* ShmOpen is
1ee90 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64   disabled */.  d
1eea0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
1eeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1eec0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
1eed0 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
1eee0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1eef0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
1ef00 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
1ef10 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1ef20 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
1ef30 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
1ef40 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65  vedLock  /* xChe
1ef50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1ef60 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
1ef70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1ef80 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
1ef90 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
1efa0 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
1efb0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
1efc0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1efd0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
1efe0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
1eff0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1f000 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1f010 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
1f020 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1f030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d            /* Shm
1f040 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64  Open is disabled
1f050 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
1f060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f070 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1f080 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
1f0b0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
1f0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1f0d0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
1f0e0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
1f0f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
1f100 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1f110 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1f120 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
1f130 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
1f140 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
1f150 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1f160 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1f170 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
1f180 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1f190 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1f1a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1f1b0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70          /* ShmOp
1f1e0 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  en is disabled *
1f1f0 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f210 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1f220 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f240 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1f250 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f270 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1f280 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
1f290 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
1f2a0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1f2b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1f2c0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1f2d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1f2e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1f2f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
1f300 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
1f310 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1f320 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1f330 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1f340 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
1f350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
1f360 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1f370 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1f380 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f3a0 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62  ShmOpen is disab
1f3b0 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
1f3c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f3d0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1f3e0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
1f3f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f400 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1f410 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
1f420 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1f430 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1f440 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
1f450 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
1f460 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1f470 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1f480 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
1f490 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
1f4a0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
1f4b0 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
1f4c0 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
1f4d0 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
1f4e0 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
1f4f0 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
1f500 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
1f510 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
1f520 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
1f530 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
1f540 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
1f550 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
1f560 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
1f570 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
1f580 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
1f590 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
1f5a0 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
1f5b0 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
1f5c0 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
1f5d0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
1f5e0 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
1f5f0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
1f600 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
1f610 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
1f620 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
1f630 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
1f640 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
1f650 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
1f660 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
1f670 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
1f680 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1f690 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1f6a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
1f6b0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
1f6c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
1f6d0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
1f6e0 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
1f6f0 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
1f700 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
1f710 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
1f720 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
1f730 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
1f740 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
1f750 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a  3_file*, int*);.
1f760 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
1f770 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
1f780 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1f790 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1f7a0 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
1f7b0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
1f7c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1f7d0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1f7e0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f800 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73  * ShmOpen is dis
1f810 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
1f820 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1f830 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1f840 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
1f850 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1f860 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1f870 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
1f880 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1f890 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1f8a0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
1f8b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1f8c0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
1f8d0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1f8e0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
1f8f0 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
1f900 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
1f910 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
1f920 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
1f930 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
1f940 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1f950 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1f960 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f970 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
1f980 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
1f990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1f9a0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1f9b0 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
1f9c0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
1f9d0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1f9e0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1f9f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e        /* ShmOpen
1fa20 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
1fa30 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa50 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1fa60 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa80 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1fa90 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20  .  nfsUnlock,   
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fab0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1fac0 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
1fad0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
1fae0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1faf0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
1fb00 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
1fb10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1fb20 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1fb30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1fb40 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
1fb50 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
1fb60 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
1fb70 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
1fb80 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
1fb90 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
1fba0 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
1fbb0 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
1fbc0 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
1fbd0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
1fbe0 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
1fbf0 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
1fc00 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
1fc10 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e  is for MacOSX on
1fc20 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
1fc30 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1fc40 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
1fc50 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
1fc60 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
1fc70 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
1fc80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fc90 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
1fca0 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
1fcb0 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65      /* open file
1fcc0 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
1fcd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1fce0 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
1fcf0 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e  st struct Mappin
1fd00 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  g {.    const ch
1fd10 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b  ar *zFilesystem;
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fd30 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   Filesystem type
1fd40 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   name */.    con
1fd50 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1fd60 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b  thods *pMethods;
1fd70 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74     /* Appropriat
1fd80 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1fd90 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d   */.  } aMap[] =
1fda0 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
1fdb0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
1fdc0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73  ds },.    { "ufs
1fdd0 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
1fde0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
1fdf0 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  afpfs",  &afpIoM
1fe00 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
1fe10 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
1fe20 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
1fe30 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
1fe40 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
1fe50 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
1fe60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1fe70 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
1fe80 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
1fe90 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
1fea0 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
1feb0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
1fec0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
1fed0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
1fee0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
1fef0 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
1ff00 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
1ff10 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
1ff20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
1ff30 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
1ff40 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
1ff50 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
1ff60 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
1ff70 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
1ff80 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
1ff90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ffa0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1ffb0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
1ffc0 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
1ffd0 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
1ffe0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
1fff0 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
20000 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
20010 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
20020 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20030 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
20040 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
20050 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
20060 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
20070 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
20080 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
20090 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
200a0 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
200b0 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
200c0 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
200d0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
200e0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
200f0 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
20100 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
20110 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
20120 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
20130 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
20140 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
20150 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
20160 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
20170 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e  RDLCK;.  if( fcn
20180 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
20190 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
201a0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20  =-1 ) {.    if( 
201b0 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
201c0 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
201d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ")==0 ){.      r
201e0 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68  eturn &nfsIoMeth
201f0 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ods;.    } else 
20200 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
20210 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
20220 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20230 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
20240 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
20250 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
20260 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20270 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
20280 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
20290 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
202a0 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
202b0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
202c0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
202d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
202e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
202f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
20300 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20  .#if OS_VXWORKS 
20310 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
20320 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
20330 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
20340 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
20350 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
20360 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
20370 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
20380 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
20390 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
203a0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
203b0 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
203c0 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
203d0 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
203e0 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
203f0 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
20400 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e  s for VXWorks on
20410 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
20420 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
20430 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
20440 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
20450 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
20460 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
20470 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20480 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
20490 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
204a0 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
204b0 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
204c0 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
204d0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
204e0 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
204f0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
20500 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
20510 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
20520 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
20530 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
20540 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
20550 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
20560 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
20570 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
20580 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
20590 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
205a0 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
205b0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
205c0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
205d0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
205e0 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
205f0 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
20600 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
20610 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
20620 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
20630 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
20640 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
20650 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
20660 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
20670 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  fcntl(pNew->h, F
20680 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
20690 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
206a0 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
206b0 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
206c0 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
206d0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
206e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
206f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
20700 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
20710 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
20720 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
20730 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
20740 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
20750 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
20760 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
20770 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20780 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  E */../*.** An a
20790 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
207a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
207b0 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
207c0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
207d0 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
207e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
207f0 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
20800 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
20810 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
20820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20860 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
20870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20880 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
20890 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
208a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208b0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
208c0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
208d0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
208e0 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
208f0 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
20900 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
20910 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
20920 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
20930 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
20940 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
20950 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
20960 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
20970 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
20980 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
20990 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
209a0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
209b0 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
209c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
209d0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
209e0 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
209f0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
20a00 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20   dirfd,         
20a10 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
20a20 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
20a30 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
20a40 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
20a50 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
20a60 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
20a70 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
20a80 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
20a90 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
20aa0 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
20ab0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
20ac0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
20ad0 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
20ae0 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
20af0 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
20b00 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
20b10 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
20b20 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
20b30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20b40 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
20b50 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
20b60 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
20b70 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
20b80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20b90 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49  assert( pNew->pI
20ba0 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20  node==NULL );.. 
20bb0 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73   /* Parameter is
20bc0 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75  Delete is only u
20bd0 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  sed on vxworks. 
20be0 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70  Express this exp
20bf0 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65  licitly .  ** he
20c00 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f  re to prevent co
20c10 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
20c20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72  about unused par
20c30 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
20c40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
20c50 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 4f  (isDelete);..  O
20c60 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
20c70 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
20c80 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
20c90 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
20ca0 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66  ew->dirfd = dirf
20cb0 64 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46  d;.  pNew->fileF
20cc0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65  lags = 0;.  asse
20cd0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
20ce0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
20cf0 3d 3d 27 2f 27 20 29 3b 20 20 2f 2a 20 4e 65 76  =='/' );  /* Nev
20d00 65 72 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  er a relative pa
20d10 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 70 4e 65 77  thname */.  pNew
20d20 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  ->zPath = zFilen
20d30 61 6d 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ame;..#if OS_VXW
20d40 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
20d50 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
20d60 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
20d70 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
20d80 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63  ==0 ){.    noLoc
20d90 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
20da0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20db0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
20dc0 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  noLock ){.    pL
20dd0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
20de0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
20df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
20e00 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a  ckingStyle = (**
20e10 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56  (finder_type*)pV
20e20 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46  fs->pAppData)(zF
20e30 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a  ilename, pNew);.
20e40 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
20e50 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
20e60 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69      /* Cache zFi
20e70 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f  lename in the lo
20e80 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41  cking context (A
20e90 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f  FP and dotlock o
20ea0 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20  verride) for.   
20eb0 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63   ** proxyLock ac
20ec0 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73  tivation is poss
20ed0 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f  ible (remote pro
20ee0 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64  xy is based on d
20ef0 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a  b name).    ** z
20f00 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73  Filename remains
20f10 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c   valid until fil
20f20 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20  e is closed, to 
20f30 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70  support */.    p
20f40 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
20f50 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69  ext = (void*)zFi
20f60 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  lename;.#endif. 
20f70 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69   }..  if( pLocki
20f80 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69  ngStyle == &posi
20f90 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64  xIoMethods.#if d
20fa0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
20fb0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
20fc0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20fd0 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67  .    || pLocking
20fe0 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d  Style == &nfsIoM
20ff0 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20  ethods.#endif.  
21000 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
21010 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
21020 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
21030 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
21040 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
21050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21060 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
21070 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66  ror occured in f
21080 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
21090 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
210a0 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
210b0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
210c0 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
210d0 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
210e0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
210f0 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
21100 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
21110 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21120 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
21130 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
21140 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
21150 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
21160 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
21170 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
21180 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
21190 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
211a0 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
211b0 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
211c0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
211d0 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
211e0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
211f0 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
21200 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
21210 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
21220 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
21230 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
21240 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
21250 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
21260 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
21270 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
21280 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
21290 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
212a0 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
212b0 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
212c0 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
212d0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
212e0 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
212f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21300 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
21310 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
21320 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
21330 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
21340 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
21350 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
21360 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
21370 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
21380 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
21390 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
213a0 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
213b0 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
213c0 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
213d0 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
213e0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
213f0 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
21400 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
21410 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
21420 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
21430 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
21440 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
21450 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
21460 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
21470 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
21480 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
21490 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
214a0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
214b0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
214c0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
214d0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
214e0 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
214f0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
21500 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
21510 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
21520 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
21530 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
21540 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
21550 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
21560 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21570 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
21580 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
21590 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
215a0 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
215b0 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
215c0 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
215d0 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
215e0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
215f0 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
21600 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
21610 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
21620 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
21630 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
21640 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
21650 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
21660 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
21670 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
21680 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
21690 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
216a0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
216b0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
216c0 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
216d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
216e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
216f0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
21700 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
21710 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29          close(h)
21720 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
21730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21740 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
21750 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
21760 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
21770 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
21780 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
21790 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
217a0 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
217b0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
217c0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
217d0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
217e0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
217f0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
21800 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
21810 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
21820 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
21830 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  name;.    nFilen
21840 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
21850 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
21860 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
21870 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
21880 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
21890 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
218a0 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
218b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
218c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
218d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
218e0 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
218f0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
21900 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
21910 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
21920 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
21930 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
21940 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
21950 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
21960 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
21970 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
21980 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
21990 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
219a0 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
219b0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
219c0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
219d0 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
219e0 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
219f0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
21a00 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
21a10 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
21a20 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
21a30 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
21a40 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
21a50 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
21a60 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
21a70 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
21a80 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
21a90 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
21aa0 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
21ab0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
21ac0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
21ad0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
21ae0 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
21af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21b00 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
21b10 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
21b20 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
21b30 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
21b40 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
21b50 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
21b60 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
21b70 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
21b80 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
21b90 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
21ba0 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
21bb0 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
21bc0 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
21bd0 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
21be0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
21bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
21c00 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
21c10 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
21c20 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
21c30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
21c40 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
21c50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
21c60 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
21c70 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
21c80 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
21c90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21ca0 20 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73   if( h>=0 ) clos
21cb0 65 28 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  e(h);.    h = -1
21cc0 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69  ;.    unlink(zFi
21cd0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
21ce0 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
21cf0 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
21d00 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
21d10 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
21d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
21d30 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ( dirfd>=0 ) clo
21d40 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69  se(dirfd); /* si
21d50 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69  lent leak if fai
21d60 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72  l, already in er
21d70 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68  ror */.    if( h
21d80 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a  >=0 ) close(h);.
21d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
21da0 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
21db0 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
21dc0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
21dd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
21df0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
21e00 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
21e10 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
21e20 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
21e30 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
21e40 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
21e50 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
21e60 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
21e70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
21e80 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
21e90 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
21ea0 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
21eb0 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
21ec0 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
21ed0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
21ee0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
21ef0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
21f00 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
21f10 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
21f20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
21f30 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
21f40 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
21f50 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
21f60 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
21f70 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
21f80 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
21f90 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
21fa0 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
21fb0 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
21fc0 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
21fd0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
21fe0 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
21ff0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
22000 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
22010 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
22020 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
22030 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
22040 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
22050 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
22060 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
22070 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
22080 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
22090 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
220a0 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
220b0 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
220c0 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64  f( fd>=0 ){.#ifd
220d0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
220e0 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
220f0 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c  SETFD, fcntl(fd,
22100 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
22110 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
22120 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
22130 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
22140 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
22150 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
22160 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
22170 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
22180 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43  LITE_OK:SQLITE_C
22190 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d  ANTOPEN_BKPT);.}
221a0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
221b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
221c0 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
221d0 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  Buf must be allo
221e0 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
221f0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20  calling process 
22200 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20  and must be big 
22210 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61  enough to hold a
22220 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d  t least.** pVfs-
22230 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  >mxPathname byte
22240 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22250 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
22260 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
22270 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
22280 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
22290 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
222a0 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
222b0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
222c0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
222d0 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
222e0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
222f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
22300 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
22310 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
22320 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
22330 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
22340 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
22350 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
22360 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
22370 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74  , j;.  struct st
22380 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
22390 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22  char *zDir = "."
223a0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
223b0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
223c0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
223d0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
223e0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
223f0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
22400 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
22410 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
22420 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
22430 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
22440 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
22450 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
22460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
22470 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73 5b  RR );..  azDirs[
22480 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
22490 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
224a0 66 20 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69 72  f (NULL == azDir
224b0 73 5b 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44 69  s[1]) {.    azDi
224c0 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
224d0 54 4d 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20 20  TMPDIR");.  }.  
224e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
224f0 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
22500 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
22510 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a  i++){.    if( az
22520 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Dirs[i]==0 ) con
22530 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
22540 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26  tat(azDirs[i], &
22550 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
22560 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
22570 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
22580 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22590 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73  f( access(azDirs
225a0 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  [i], 07) ) conti
225b0 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  nue;.    zDir = 
225c0 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62  azDirs[i];.    b
225d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
225e0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
225f0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
22600 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
22610 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
22620 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
22630 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
22640 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
22650 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
22660 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74  trlen(zDir) + st
22670 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50  rlen(SQLITE_TEMP
22680 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
22690 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e  17) >= (size_t)n
226a0 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
226b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
226c0 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73    }..  do{.    s
226d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
226e0 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22  nBuf-17, zBuf, "
226f0 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
22700 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
22710 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74  r);.    j = (int
22720 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20  )strlen(zBuf);. 
22730 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
22740 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
22750 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
22760 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
22770 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
22780 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
22790 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
227a0 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
227b0 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
227c0 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
227d0 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
227e0 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
227f0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
22800 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
22810 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
22820 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
22830 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
22840 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
22850 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
22860 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
22870 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
22880 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
22890 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
228a0 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
228b0 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
228c0 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
228d0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
228e0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
228f0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
22900 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
22910 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
22920 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
22930 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
22940 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
22950 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
22960 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
22970 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
22980 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
22990 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
229a0 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
229b0 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
229c0 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
229d0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
229e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
229f0 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
22a00 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
22a10 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
22a20 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
22a30 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
22a40 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
22a50 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
22a60 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
22a70 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
22a80 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
22a90 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
22aa0 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
22ab0 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
22ac0 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
22ad0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
22ae0 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
22af0 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
22b00 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
22b10 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
22b20 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
22b30 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
22b40 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
22b50 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
22b60 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
22b70 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
22b80 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
22b90 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
22ba0 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
22bb0 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
22bc0 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
22bd0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
22be0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
22bf0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
22c00 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
22c10 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
22c20 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
22c30 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
22c40 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
22c50 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
22c60 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
22c70 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
22c80 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
22c90 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
22ca0 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
22cb0 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
22cc0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
22cd0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
22ce0 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
22cf0 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
22d00 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
22d10 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
22d20 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
22d30 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
22d40 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
22d50 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
22d60 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
22d70 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
22d80 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
22d90 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
22da0 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
22db0 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
22dc0 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
22dd0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
22de0 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
22df0 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
22e00 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
22e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22e20 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
22e30 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
22e40 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
22e50 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
22e60 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
22e70 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
22e80 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
22e90 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
22ea0 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
22eb0 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
22ec0 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
22ed0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
22ee0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
22ef0 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
22f00 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
22f10 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
22f20 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
22f30 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
22f40 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
22f50 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
22f60 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
22f70 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
22f80 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
22f90 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
22fa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
22fb0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
22fc0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
22fd0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
22fe0 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
22ff0 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
23000 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65   for a resusable
23010 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23020 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
23030 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74  */.  if( 0==stat
23040 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
23050 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
23060 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
23070 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
23080 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
23090 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
230a0 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
230b0 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
230c0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
230d0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
230e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
230f0 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
23100 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
23110 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
23120 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
23130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
23140 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
23150 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
23160 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
23170 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
23180 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
23190 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
231a0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
231b0 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
231c0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
231d0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
231e0 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
231f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
23200 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
23210 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
23220 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
23230 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
23240 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
23250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
23260 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
23270 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
23280 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
23290 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
232a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
232b0 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
232c0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
232d0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
232e0 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
232f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
23300 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
23310 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
23320 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
23330 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
23340 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
23350 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
23360 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
23370 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
23380 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
23390 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
233a0 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
233b0 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
233c0 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
233d0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
233e0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
233f0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
23400 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
23410 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
23420 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
23430 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
23440 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
23450 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
23460 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
23470 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
23480 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
23490 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
234a0 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
234b0 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
234c0 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
234d0 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
234e0 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
234f0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
23500 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
23510 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
23520 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
23530 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
23540 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
23550 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
23560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
23570 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
23580 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
23590 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
235a0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
235b0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
235c0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
235d0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
235e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
235f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23600 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
23610 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
23620 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
23650 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
23660 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
23670 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
23680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
23690 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
236a0 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
236b0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
236c0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
236d0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
236e0 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
236f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23700 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
23710 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
23720 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  ) */.  int dirfd
23730 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
23740 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
23750 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
23760 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  or */.  int open
23770 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
23780 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
23790 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
237a0 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
237b0 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
237c0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
237d0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
237e0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
23810 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
23820 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
23830 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
23840 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
23850 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
23860 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
23870 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
23880 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
23890 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
238a0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
238b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
238c0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
238d0 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
238e0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
238f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
23900 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
23910 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
23920 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
23930 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
23940 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
23950 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23960 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23970 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
23980 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
23990 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
239a0 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
239b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
239c0 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
239d0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
239e0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
239f0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
23a00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
23a10 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
23a20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
23a30 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
23a40 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
23a50 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
23a60 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
23a70 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
23a80 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
23a90 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
23aa0 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
23ab0 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
23ac0 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
23ad0 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65  ate && .      (e
23ae0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23af0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
23b00 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
23b10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
23b20 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  NAL).  );..  /* 
23b30 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
23b40 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
23b50 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
23b60 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
23b70 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
23b80 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
23b90 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
23ba0 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
23bb0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
23bc0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
23bd0 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20  X_PATHNAME+1];. 
23be0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
23bf0 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
23c00 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
23c10 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
23c20 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
23c30 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
23c40 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
23c50 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
23c60 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
23c70 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
23c80 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
23c90 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
23ca0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
23cb0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
23cc0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
23cd0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
23ce0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
23cf0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
23d00 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
23d10 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
23d20 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
23d30 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
23d40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
23d50 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
23d60 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
23d70 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
23d80 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
23d90 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
23da0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
23db0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
23dc0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
23dd0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
23de0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
23df0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
23e00 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
23e10 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
23e20 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
23e30 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
23e40 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
23e50 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
23e60 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
23e70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
23e80 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
23e90 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
23ea0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
23eb0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
23ec0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
23ed0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
23ee0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
23ef0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
23f00 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
23f10 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
23f20 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
23f30 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
23f40 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 0a 20 20  R_JOURNAL );..  
23f50 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
23f60 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
23f70 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
23f80 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
23f90 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
23fa0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
23fb0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
23fc0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
23fd0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
23fe0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
23ff0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
24000 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
24010 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
24020 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
24030 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
24040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
24050 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
24060 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
24070 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
24080 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
24090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
240a0 53 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20  SIENT_DB.  );.. 
240b0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
240c0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
240d0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
240e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
240f0 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
24100 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
24110 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
24120 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
24130 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
24140 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
24150 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
24160 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
24170 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
24180 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
24190 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
241a0 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  d));.      if( !
241b0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
241c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
241d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
241e0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e      }.    p->pUn
241f0 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
24200 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61    }else if( !zNa
24210 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  me ){.    /* If 
24220 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74  zName is NULL, t
24230 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69  he upper layer i
24240 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74  s requesting a t
24250 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  emp file. */.   
24260 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
24270 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63   && !isOpenDirec
24280 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20  tory);.    rc = 
24290 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
242a0 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70  PATHNAME+1, zTmp
242b0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
242c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
242d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
242e0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
242f0 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
24300 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
24310 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
24320 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
24330 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
24340 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
24350 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
24360 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
24370 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
24380 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
24390 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
243a0 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
243b0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
243c0 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
243d0 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
243e0 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
243f0 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
24400 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
24410 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
24420 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
24430 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
24440 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
24450 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
24460 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
24470 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
24480 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
24490 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
244a0 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
244b0 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
244c0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
244d0 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
244e0 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
244f0 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
24500 6e 4d 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74  nMode = (isDelet
24510 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
24520 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
24530 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20  SSIONS);.    fd 
24540 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  = open(zName, op
24550 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
24560 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
24570 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
24580 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
24590 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29  ame, openFlags))
245a0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
245b0 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20  & errno!=EISDIR 
245c0 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26  && isReadWrite &
245d0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
245e0 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65  {.      /* Faile
245f0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
24600 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
24610 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
24620 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
24630 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
24640 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
24650 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
24660 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70  REATE);.      op
24670 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52  enFlags &= ~(O_R
24680 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20  DWR|O_CREAT);.  
24690 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
246a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
246b0 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  Y;.      openFla
246c0 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
246d0 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28        fd = open(
246e0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
246f0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
24700 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
24710 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
24720 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
24730 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  PT;.      goto o
24740 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
24750 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
24760 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ( fd>=0 );.  if(
24770 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
24780 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
24790 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
247a0 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20   p->pUnused ){. 
247b0 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
247c0 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70  d = fd;.    p->p
247d0 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
247e0 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
247f0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
24800 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
24810 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
24820 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b  #else.    unlink
24830 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
24840 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
24850 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24860 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
24870 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
24880 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
24890 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4f 70  ndif..  if( isOp
248a0 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  enDirectory ){. 
248b0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65     rc = openDire
248c0 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69  ctory(zPath, &di
248d0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
248e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
248f0 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 73 61       /* It is sa
24900 66 65 20 74 6f 20 63 6c 6f 73 65 20 66 64 20 61  fe to close fd a
24910 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65  t this point, be
24920 63 61 75 73 65 20 69 74 20 69 73 20 67 75 61 72  cause it is guar
24930 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20 20 20 20  anteed not.     
24940 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f   ** to be open o
24950 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
24960 65 2e 20 49 66 20 69 74 20 77 65 72 65 20 6f 70  e. If it were op
24970 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  en on a database
24980 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20   file,.      ** 
24990 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
249a0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 61 73  safe to close as
249b0 20 74 68 69 73 20 77 6f 75 6c 64 20 72 65 6c 65   this would rele
249c0 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65  ase any locks he
249d0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ld.      ** on t
249e0 68 65 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  he file by this 
249f0 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20  process.  */.   
24a00 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
24a10 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
24a20 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 63  IN_DB );.      c
24a30 6c 6f 73 65 28 66 64 29 3b 20 20 20 20 20 20 20  lose(fd);       
24a40 20 20 20 20 20 20 2f 2a 20 73 69 6c 65 6e 74 6c        /* silentl
24a50 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  y leak if fail, 
24a60 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72  already in error
24a70 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   */.      goto o
24a80 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
24a90 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
24aa0 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e  FD_CLOEXEC.  fcn
24ab0 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
24ac0 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  fcntl(fd, F_GETF
24ad0 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
24ae0 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
24af0 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
24b00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24b10 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69  DB;..  .#if defi
24b20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
24b30 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
24b40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
24b50 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
24b60 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61  Info;.  if( fsta
24b70 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29  tfs(fd, &fsInfo)
24b80 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28   == -1 ){.    ((
24b90 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
24ba0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
24bb0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72  rno;.    if( dir
24bc0 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69  fd>=0 ) close(di
24bd0 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  rfd); /* silentl
24be0 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20  y leak if fail, 
24bf0 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
24c00 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
24c10 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
24c20 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
24c30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24c40 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
24c50 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
24c60 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c  strncmp("msdos",
24c70 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
24c80 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
24c90 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
24ca0 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
24cb0 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
24cc0 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
24cd0 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45  if.  .#if SQLITE
24ce0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24cf0 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45  STYLE.#if SQLITE
24d00 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
24d10 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72  CKING.  isAutoPr
24d20 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  oxy = 1;.#endif.
24d30 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78    if( isAutoProx
24d40 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c  y && (zPath!=NUL
24d50 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20  L) && (!noLock) 
24d60 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29  && pVfs->xOpen )
24d70 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66  {.    char *envf
24d80 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53  orce = getenv("S
24d90 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
24da0 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20  Y_LOCKING");.   
24db0 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20   int useProxy = 
24dc0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  0;..    /* SQLIT
24dd0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
24de0 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66  CKING==1 means f
24df0 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20  orce always use 
24e00 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a  proxy, 0 means .
24e10 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65      ** never use
24e20 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61   proxy, NULL mea
24e30 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72  ns use proxy for
24e40 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73   non-local files
24e50 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69   only.  */.    i
24e60 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c  f( envforce!=NUL
24e70 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72  L ){.      usePr
24e80 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f  oxy = atoi(envfo
24e90 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73  rce)>0;.    }els
24ea0 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  e{.      struct 
24eb0 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
24ec0 20 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28       if( statfs(
24ed0 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  zPath, &fsInfo) 
24ee0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  == -1 ){.       
24ef0 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
24f00 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c  he close(fd) cal
24f10 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c  l is sub-optimal
24f20 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  . If the file op
24f30 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ened.        ** 
24f40 77 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74  with fd is a dat
24f50 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20  abase file, and 
24f60 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
24f70 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e  connections open
24f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  .        ** on t
24f90 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72  hat file that ar
24fa0 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64  e currently hold
24fb0 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  ing advisory loc
24fc0 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20  ks on it,.      
24fd0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61    ** then the ca
24fe0 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69  ll to close() wi
24ff0 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20  ll cancel those 
25000 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69  locks. In practi
25010 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ce,.        ** w
25020 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68  e're assuming th
25030 61 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73  at statfs() does
25040 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66  n't fail very of
25050 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20  ten. At least.  
25060 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69        ** not whi
25070 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  le other file de
25080 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
25090 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
250a0 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20  cess on.        
250b0 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ** the same file
250c0 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a   are working.  *
250d0 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73  /.        p->las
250e0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
250f0 20 20 20 20 20 20 20 20 69 66 28 20 64 69 72 66          if( dirf
25100 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d>=0 ){.        
25110 20 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20    close(dirfd); 
25120 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b  /* silently leak
25130 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72   if fail, in err
25140 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  or */.        }.
25150 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64          close(fd
25160 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
25170 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20  eak if fail, in 
25180 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
25190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
251a0 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
251b0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
251c0 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
251d0 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
251e0 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
251f0 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
25200 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
25210 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
25220 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
25230 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64  (pVfs, fd, dirfd
25240 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
25250 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65  noLock, isDelete
25260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
25270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25280 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
25290 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
252a0 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
252b0 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
252c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
252d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
252e0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
252f0 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
25300 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
25310 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
25320 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
25330 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
25340 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
25350 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
25360 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
25370 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
25380 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
25390 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
253a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
253b0 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
253c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
253d0 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
253e0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
253f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25400 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25410 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
25420 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
25430 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
25440 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
25450 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66  e(pVfs, fd, dirf
25460 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
25470 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74   noLock, isDelet
25480 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65  e);.open_finishe
25490 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
254a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
254b0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55  lite3_free(p->pU
254c0 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
254d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
254e0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
254f0 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
25500 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
25510 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
25520 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
25530 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
25540 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
25550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
25560 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
25570 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
25580 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
25590 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
255a0 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
255b0 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
255c0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
255d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
255e0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
255f0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25610 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
25620 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
25630 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
25640 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
25650 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
25660 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
25670 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
25680 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
25690 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
256a0 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e  DELETE);.  unlin
256b0 6b 28 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65  k(zPath);.#ifnde
256c0 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
256d0 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64  _DIRSYNC.  if( d
256e0 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e  irSync ){.    in
256f0 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
25700 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
25710 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66  th, &fd);.    if
25720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25730 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
25740 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  S.      if( fsyn
25750 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73  c(fd)==-1 ).#els
25760 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  e.      if( fsyn
25770 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20  c(fd) ).#endif. 
25780 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72       {.        r
25790 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
257a0 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20  _DIR_FSYNC;.    
257b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c    }.      if( cl
257c0 6f 73 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a  ose(fd)&&!rc ){.
257d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
257e0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
257f0 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OSE;.      }.   
25800 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
25810 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25820 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69  .** Test the exi
25830 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63  stance of or acc
25840 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ess permissions 
25850 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54  of file zPath. T
25860 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f  he.** test perfo
25870 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rmed depends on 
25880 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61  the value of fla
25890 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  gs:.**.**     SQ
258a0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
258b0 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TS: Return 1 if 
258c0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a  the file exists.
258d0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
258e0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20  CESS_READWRITE: 
258f0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
25900 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64  file is read and
25910 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20   writable..**   
25920 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
25930 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e  READONLY: Return
25940 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
25950 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a  s readable..**.*
25960 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75  * Otherwise retu
25970 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
25980 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a  int unixAccess(.
25990 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
259a0 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65  otUsed,   /* The
259b0 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
259c0 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74  this xAccess met
259d0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
259e0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
259f0 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20   /* Path of the 
25a00 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20  file to examine 
25a10 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a30 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20  What do we want 
25a40 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74  to learn about t
25a50 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a  he zPath file? *
25a60 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
25a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
25a80 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c  rite result bool
25a90 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ean here */.){. 
25aa0 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a   int amode = 0;.
25ab0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25ac0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
25ad0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
25ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25af0 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
25b00 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
25b10 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
25b20 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
25b30 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46  .      amode = F
25b40 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
25b50 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
25b60 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
25b70 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TE:.      amode 
25b80 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20  = W_OK|R_OK;.   
25b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
25ba0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
25bb0 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f  _READ:.      amo
25bc0 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20  de = R_OK;.     
25bd0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
25be0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
25bf0 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
25c00 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
25c10 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
25c20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61  (access(zPath, a
25c30 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74  mode)==0);.  ret
25c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25c50 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
25c60 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
25c70 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
25c80 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
25c90 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
25ca0 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
25cb0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
25cc0 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
25cd0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
25ce0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
25cf0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
25d00 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
25d10 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
25d20 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
25d30 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
25d40 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
25d50 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
25d60 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
25d70 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
25d80 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
25d90 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
25da0 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
25db0 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
25dc0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
25dd0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
25de0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
25df0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25e00 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
25e10 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
25e20 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
25e30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
25e60 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
25e70 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
25e80 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
25e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
25ea0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
25eb0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
25ec0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
25ed0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
25ee0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
25ef0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
25f00 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
25f10 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
25f20 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
25f30 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
25f40 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
25f50 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
25f60 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
25f70 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
25f80 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
25f90 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
25fa0 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
25fb0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
25fc0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
25fd0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
25fe0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
25ff0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
26000 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
26010 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26020 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75  ER(pVfs);..  zOu
26030 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27  t[nOut-1] = '\0'
26040 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
26050 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
26060 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
26070 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20  ut, zOut, "%s", 
26080 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
26090 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20  .    int nCwd;. 
260a0 20 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f     if( getcwd(zO
260b0 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29  ut, nOut-1)==0 )
260c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
260d0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
260e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
260f0 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Cwd = (int)strle
26100 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
26110 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
26120 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
26130 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
26140 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
26150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26170 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
26180 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
26190 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
261a0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
261b0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
261c0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
261d0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
261e0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
261f0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
26200 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
26210 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
26220 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
26230 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
26240 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
26250 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
26260 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
26270 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
26280 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
26290 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
262a0 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
262b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
262c0 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
262d0 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
262e0 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
262f0 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
26300 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
26310 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
26320 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
26330 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
26340 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
26350 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
26360 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
26370 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
26380 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
26390 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
263a0 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
263b0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
263c0 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
263d0 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
263e0 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
263f0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
26400 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
26410 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
26420 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
26430 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  ut){.  char *zEr
26440 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
26450 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
26460 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
26470 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
26480 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
26490 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
264a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
264b0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
264c0 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
264d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
264e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
264f0 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
26500 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
26510 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
26520 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
26530 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
26540 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
26550 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
26560 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
26570 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
26580 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
26590 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
265a0 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
265b0 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
265c0 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
265d0 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
265e0 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
265f0 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
26600 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
26610 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
26620 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
26630 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
26640 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
26650 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
26660 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
26670 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
26680 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
26690 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
266a0 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
266b0 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
266c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
266d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
266e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
266f0 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
26700 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
26710 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
26720 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
26730 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
26740 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
26750 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
26760 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
26770 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
26780 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
26790 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
267a0 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
267b0 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
267c0 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
267d0 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
267e0 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
267f0 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
26800 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
26810 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
26820 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
26830 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
26840 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
26850 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
26860 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
26870 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
26880 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
26890 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
268a0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
268b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
268c0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
268d0 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
268e0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
268f0 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
26900 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
26910 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
26920 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
26930 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
26940 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
26950 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
26960 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
26970 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
26980 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
26990 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
269a0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
269b0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
269c0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
269d0 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
269e0 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
269f0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
26a00 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
26a10 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
26a20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
26a30 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
26a40 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
26a50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
26a60 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
26a70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
26a80 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
26a90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
26aa0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
26ab0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
26ac0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
26ad0 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
26ae0 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
26af0 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
26b00 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
26b10 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
26b20 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
26b30 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
26b40 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
26b50 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
26b60 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
26b70 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
26b80 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
26b90 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
26ba0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
26bb0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
26bc0 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
26bd0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
26be0 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
26bf0 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
26c00 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
26c10 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
26c20 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
26c30 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
26c40 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
26c50 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
26c60 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
26c70 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
26c80 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
26c90 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
26ca0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
26cb0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
26cc0 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
26cd0 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
26ce0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
26cf0 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
26d00 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
26d10 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
26d20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
26d30 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
26d40 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
26d50 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
26d60 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
26d70 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
26d80 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
26d90 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  f);.#if !defined
26da0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
26db0 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66  {.    int pid, f
26dc0 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  d;.    fd = open
26dd0 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
26de0 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20   O_RDONLY);.    
26df0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
26e00 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
26e10 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20    time(&t);.    
26e20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26    memcpy(zBuf, &
26e30 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  t, sizeof(t));. 
26e40 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69       pid = getpi
26e50 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  d();.      memcp
26e60 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74  y(&zBuf[sizeof(t
26e70 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  )], &pid, sizeof
26e80 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73  (pid));.      as
26e90 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b  sert( sizeof(t)+
26ea0 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69  sizeof(pid)<=(si
26eb0 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
26ec0 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
26ed0 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64  (t) + sizeof(pid
26ee0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26ef0 20 20 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28      nBuf = read(
26f00 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b  fd, zBuf, nBuf);
26f10 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
26f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
26f30 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
26f40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
26f50 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
26f60 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
26f70 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
26f80 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
26f90 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
26fa0 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
26fb0 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
26fc0 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
26fd0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
26fe0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
26ff0 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
27000 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
27010 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
27020 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
27030 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
27040 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
27050 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
27060 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
27070 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
27080 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
27090 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
270a0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
270b0 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
270c0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
270d0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
270e0 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
270f0 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
27100 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
27110 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
27120 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
27130 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
27140 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
27150 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
27160 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
27170 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
27180 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
27190 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
271a0 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
271b0 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
271c0 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
271d0 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
271e0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
271f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27200 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
27210 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
27220 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
27230 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
27240 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
27250 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
27260 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
27270 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
27280 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
27290 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
272a0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
272b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
272c0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
272d0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
272e0 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
272f0 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
27300 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
27310 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
27320 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
27330 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
27340 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
27350 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
27360 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
27370 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
27380 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
27390 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
273a0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
273b0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
273c0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
273d0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
273e0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
273f0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
27400 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
27410 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
27420 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
27430 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
27440 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
27450 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
27460 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
27470 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
27480 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
27490 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
274a0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
274b0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
274c0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
274d0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
274e0 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
274f0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
27500 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
27510 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
27520 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
27530 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
27540 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
27550 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
27560 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
27570 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27580 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
27590 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
275a0 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
275b0 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
275c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
275d0 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
275e0 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
275f0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
27600 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69  640000;.#if defi
27610 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
27620 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
27630 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
27640 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
27650 34 29 69 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)i)*1000 + unix
27660 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
27670 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
27680 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
27690 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
276a0 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
276b0 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
276c0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
276d0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
276e0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
276f0 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
27700 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
27710 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
27720 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64  ow;.  gettimeofd
27730 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20  ay(&sNow, 0);.  
27740 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
27750 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
27760 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
27770 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
27780 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
27790 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
277a0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
277b0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
277c0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
277d0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
277e0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
277f0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
27800 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
27810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27820 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
27830 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
27840 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
27850 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
27860 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
27870 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
27880 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
27890 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
278a0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
278b0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
278c0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
278d0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
278e0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
278f0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
27900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27910 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
27920 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
27930 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
27940 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
27950 69 6e 74 36 34 20 69 3b 0a 20 20 75 6e 69 78 43  int64 i;.  unixC
27960 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
27970 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
27980 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
27990 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
279a0 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74  /*.** We added t
279b0 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
279c0 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74  () method with t
279d0 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20  he intention of 
279e0 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74  providing.** bet
279f0 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72  ter low-level er
27a00 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65  ror messages whe
27a10 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74  n operating-syst
27a20 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65  em problems come
27a30 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51   up.** during SQ
27a40 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Lite operation. 
27a50 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e   But so far, non
27a60 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65  e of that has be
27a70 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  en implemented.*
27a80 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20  * in the core.  
27a90 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  So this routine 
27aa0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
27ab0 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73    For now, it is
27ac0 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61   merely.** a pla
27ad0 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74  ce-holder..*/.st
27ae0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
27af0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
27b00 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
27b10 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
27b20 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
27b30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27b40 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
27b50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
27b60 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
27b70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
27b80 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
27b90 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a   0;.}.../*.*****
27ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27bb0 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
27bc0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
27bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
27bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
27c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
27c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ca0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
27cb0 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
27cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
27ce0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
27cf0 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
27d00 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
27d10 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
27d20 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
27d30 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
27d40 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
27d50 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
27d60 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
27d70 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
27d80 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
27d90 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
27da0 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
27db0 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
27dc0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
27dd0 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
27de0 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
27df0 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
27e00 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
27e10 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
27e20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
27e30 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
27e40 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
27e50 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
27e60 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
27e70 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
27e80 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
27e90 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
27ea0 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
27eb0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
27ec0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
27ed0 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
27ee0 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
27ef0 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
27f00 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
27f10 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
27f20 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
27f30 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
27f40 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
27f50 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
27f60 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
27f70 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
27f80 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
27f90 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
27fa0 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
27fb0 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
27fc0 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
27fd0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
27fe0 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
27ff0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
28000 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
28010 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
28020 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
28030 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
28040 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
28050 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
28060 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
28070 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
28080 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
28090 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
280a0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
280b0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
280c0 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
280d0 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
280e0 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
280f0 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
28100 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
28110 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
28120 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
28130 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
28140 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
28150 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
28160 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
28170 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
28180 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
28190 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
281a0 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
281b0 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
281c0 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20  000000..   ..** 
281d0 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
281e0 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
281f0 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
28200 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
28210 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
28220 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
28230 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
28240 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
28250 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
28260 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
28270 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
28280 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
28290 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
282a0 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
282b0 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
282c0 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
282d0 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
282e0 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
282f0 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
28300 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
28310 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
28320 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
28330 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
28340 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
28350 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
28360 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
28370 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
28380 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
28390 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
283a0 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
283b0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
283c0 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
283d0 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
283e0 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
283f0 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
28400 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
28410 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
28420 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
28430 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
28440 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
28450 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
28460 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
28470 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
28480 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
28490 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
284a0 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
284b0 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
284c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
284d0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
284e0 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
284f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
28500 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
28510 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
28520 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
28530 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
28540 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
28550 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
28560 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
28570 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
28580 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
28590 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
285a0 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
285b0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
285c0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
285d0 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
285e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
285f0 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
28600 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
28610 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
28620 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45  bname, SQLITE_SE
28630 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
28640 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
28650 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
28660 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
28670 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
28680 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
28690 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
286a0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
286b0 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e  E, &<proxy_path>
286c0 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20  );.**.**.** SQL 
286d0 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50  pragmas.**.**  P
286e0 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
286f0 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
28700 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20  =<proxy_path> | 
28710 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d  :auto:.**  PRAGM
28720 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
28730 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a  k_proxy_file.**.
28740 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a  ** Specifying ":
28750 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61  auto:" means tha
28760 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  t if there is a 
28770 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20  conch file with 
28780 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f  a matching.** ho
28790 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65  st ID in it, the
287a0 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74   proxy path in t
287b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
287c0 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65  ll be used, othe
287d0 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79  rwise.** a proxy
287e0 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74   path based on t
287f0 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64  he user's temp d
28800 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73  ir.** (via confs
28810 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  tr(_CS_DARWIN_US
28820 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29  ER_TEMP_DIR,...)
28830 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  ) will be used a
28840 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c  nd the.** actual
28850 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65   proxy file name
28860 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72   is generated fr
28870 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20  om the name and 
28880 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64  path of the.** d
28890 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46  atabase file.  F
288a0 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
288b0 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61  *       For data
288c0 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72  base path "/User
288d0 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a  s/me/foo.db" .**
288e0 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20         The lock 
288f0 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74  path will be "<t
28900 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f  mpdir>/sqliteplo
28910 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f  cks/_Users_me_fo
28920 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a  o.db:auto:").**.
28930 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70  ** Once a lock p
28940 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72  roxy is configur
28950 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ed for a databas
28960 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74  e connection, it
28970 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72   can not.** be r
28980 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20  emoved, however 
28990 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68  it may be switch
289a0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
289b0 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61  t proxy path via
289c0 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50  .** the above AP
289d0 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  Is (assuming the
289e0 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e   conch file is n
289f0 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79  ot being held by
28a00 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e   another.** conn
28a10 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73  ection or proces
28a20 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f  s). .**.**.** Ho
28a30 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  w proxy locking 
28a40 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  works.** -------
28a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a60 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c  .**.** Proxy fil
28a70 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73  e locking relies
28a80 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77   primarily on tw
28a90 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67  o new supporting
28aa0 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20   files: .**.**  
28ab0 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74   *  conch file t
28ac0 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74  o limit access t
28ad0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28ae0 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ile to a single 
28af0 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20  host.**      at 
28b00 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a  a time.**.**   *
28b10 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20    proxy file to 
28b20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66  act as a proxy f
28b30 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20  or the advisory 
28b40 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  locks normally.*
28b50 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20  *      taken on 
28b60 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  the database.**.
28b70 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  ** The conch fil
28b80 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f  e - to use a pro
28b90 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20  xy file, sqlite 
28ba0 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64  must first "hold
28bb0 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62   the conch".** b
28bc0 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69  y taking an sqli
28bd0 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20  te-style shared 
28be0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
28bf0 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20  h file, reading 
28c00 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
28c10 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  and comparing th
28c20 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20  e host's unique 
28c30 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c  host ID (see bel
28c40 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20  ow) and lock.** 
28c50 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e  proxy path again
28c60 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  st the values st
28c70 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63  ored in the conc
28c80 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69  h.  The conch fi
28c90 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20  le is.** stored 
28ca0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
28cb0 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74  ctory as the dat
28cc0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
28cd0 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20  he file name.** 
28ce0 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74  is patterned aft
28cf0 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
28d00 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c  file name as ".<
28d10 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f  databasename>-co
28d20 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20  nch"..** If the 
28d30 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20  conch file does 
28d40 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74  not exist, or it
28d50 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e  's contents do n
28d60 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  ot match the.** 
28d70 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70  host ID and/or p
28d80 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20  roxy path, then 
28d90 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61  the lock is esca
28da0 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c  lated to an excl
28db0 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e  usive.** lock an
28dc0 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  d the conch file
28dd0 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64   contents is upd
28de0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f  ated with the ho
28df0 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a  st ID and proxy.
28e00 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20  ** path and the 
28e10 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64  lock is downgrad
28e20 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ed to a shared l
28e30 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74  ock again.  If t
28e40 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68  he conch.** is h
28e50 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70  eld by another p
28e60 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73  rocess (with a s
28e70 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65  hared lock), the
28e80 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
28e90 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64  ** will fail and
28ea0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
28eb0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
28ec0 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d  The proxy file -
28ed0 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66   a single-byte f
28ee0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c  ile used for all
28ef0 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c   advisory file l
28f00 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79  ocks.** normally
28f10 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
28f20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54  tabase file.   T
28f30 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73  his allows for s
28f40 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f  afe sharing.** o
28f50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
28f60 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65  ile for multiple
28f70 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69   readers and wri
28f80 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ters on the same
28f90 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f  .** host (the co
28fa0 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74  nch ensures that
28fb0 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68   they all use th
28fc0 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63  e same local loc
28fd0 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52  k file)..**.** R
28fe0 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f  equesting the lo
28ff0 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f  ck proxy does no
29000 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61  t immediately ta
29010 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74  ke the conch, it
29020 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65   is.** only take
29030 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  n when the first
29040 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b   request to lock
29050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
29060 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69  s made.  .** Thi
29070 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  s matches the se
29080 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74  mantics of the t
29090 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  raditional locki
290a0 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65  ng behavior, whe
290b0 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20  re.** opening a 
290c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
290d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f  database file do
290e0 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f  es not take a lo
290f0 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65  ck on it..** The
29100 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
29110 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65   an open file de
29120 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69  scriptor are mai
29130 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a  ntained until .*
29140 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
29150 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29160 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a   is closed. .**.
29170 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
29180 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66  e and the lock f
29190 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65  ile are never de
291a0 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e  leted so they on
291b0 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ly need.** to be
291c0 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72   created the fir
291d0 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65  st time they are
291e0 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   used..**.** Con
291f0 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
29200 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ns.** ----------
29210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
29220 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  *  SQLITE_PREFER
29230 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a  _PROXY_LOCKING.*
29240 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62  *.**       Datab
29250 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73  ase files access
29260 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  ed on non-local 
29270 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65  file systems are
29280 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61  .**       automa
29290 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72  tically configur
292a0 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ed for proxy loc
292b0 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73  king, lock files
292c0 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61   are.**       na
292d0 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
292e0 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  y using the same
292f0 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20   logic as.**    
29300 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70     PRAGMA lock_p
29310 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f  roxy_file=":auto
29320 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51  :".**    .**  SQ
29330 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
29340 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61  .**.**       Ena
29350 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67  bles the logging
29360 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67   of error messag
29370 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69  es during host i
29380 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  d file.**       
29390 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72  retrieval and cr
293a0 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f  eation.**.**  LO
293b0 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a  CKPROXYDIR.**.**
293c0 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73         Overrides
293d0 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72   the default dir
293e0 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20  ectory used for 
293f0 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
29400 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61   that.**       a
29410 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74  re named automat
29420 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22  ically via the "
29430 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a  :auto:" setting.
29440 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45  **.**  SQLITE_DE
29450 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
29460 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a  ERMISSIONS.**.**
29470 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f         Permissio
29480 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63  ns to use when c
29490 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74  reating a direct
294a0 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ory for storing 
294b0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63  the.**       loc
294c0 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f  k proxy files, o
294d0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f  nly used when LO
294e0 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f  CKPROXYDIR is no
294f0 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a  t set..**    .**
29500 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69      .** As menti
29510 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e  oned above, when
29520 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
29530 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
29540 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73  XY_LOCKING,.** s
29550 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72  etting the envir
29560 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
29570 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
29580 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20  XY_LOCKING to 1 
29590 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72  will.** force pr
295a0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
295b0 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79  e used for every
295c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
295d0 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20  pened, and 0.** 
295e0 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d  will force autom
295f0 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69  atic proxy locki
29600 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ng to be disable
29610 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  d for all databa
29620 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70  se.** files (exp
29630 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74  licity calling t
29640 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  he SQLITE_SET_LO
29650 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67  CKPROXYFILE prag
29660 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f  ma or.** sqlite_
29670 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49  file_control API
29680 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64   is not affected
29690 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   by SQLITE_FORCE
296a0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e  _PROXY_LOCKING).
296b0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79  .*/../*.** Proxy
296c0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
296d0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
296e0 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66  cOSX .*/.#if def
296f0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29700 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29710 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
29720 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c  /*.** The proxyL
29730 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61  ockingContext ha
29740 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66  s the path and f
29750 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ile structures f
29760 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a  or the remote .*
29770 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78  * and local prox
29780 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f  y files in it.*/
29790 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
297a0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
297b0 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  ext proxyLocking
297c0 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
297d0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
297e0 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ext {.  unixFile
297f0 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
29800 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
29810 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ch file */.  cha
29820 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  r *conchFilePath
29830 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
29840 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66  e of the conch f
29850 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
29860 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20  e *lockProxy;   
29870 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72        /* Open pr
29880 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
29890 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f  .  char *lockPro
298a0 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  xyPath;         
298b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
298c0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
298d0 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68  /.  char *dbPath
298e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
298f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
29900 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69  open file */.  i
29910 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20  nt conchHeld;   
29920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
29930 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
29940 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63   held, -1 if loc
29950 6b 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20  kless */.  void 
29960 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  *oldLockingConte
29970 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  xt;     /* Origi
29980 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65  nal lockingconte
29990 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e  xt to restore on
299a0 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69   close */.  sqli
299b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
299c0 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64  onst *pOldMethod
299d0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
299e0 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f  l I/O methods fo
299f0 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  r close */.};../
29a00 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  * .** The proxy 
29a10 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66  lock file path f
29a20 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
29a30 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69  at dbPath is wri
29a40 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c  tten into lPath,
29a50 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20   .** which must 
29a60 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20  point to valid, 
29a70 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20  writable memory 
29a80 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
29a90 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68   a maxLen length
29aa0 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a  .** file path. .
29ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
29ac0 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63  oxyGetLockPath(c
29ad0 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
29ae0 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20  h, char *lPath, 
29af0 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a  size_t maxLen){.
29b00 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
29b10 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b   dbLen;.  int i;
29b20 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f  ..#ifdef LOCKPRO
29b30 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74  XYDIR.  len = st
29b40 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43  rlcpy(lPath, LOC
29b50 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65  KPROXYDIR, maxLe
29b60 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65  n);.#else.# ifde
29b70 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  f _CS_DARWIN_USE
29b80 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20  R_TEMP_DIR.  {. 
29b90 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28     if( !confstr(
29ba0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
29bb0 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c  TEMP_DIR, lPath,
29bc0 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20   maxLen) ){.    
29bd0 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
29be0 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20  OCKPATH  failed 
29bf0 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d  %s errno=%d pid=
29c00 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
29c10 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72        lPath, err
29c20 6e 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  no, getpid()));.
29c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29c40 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
29c50 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
29c60 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
29c70 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d  sqliteplocks", m
29c80 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a  axLen);    .  }.
29c90 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73  # else.  len = s
29ca0 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f  trlcpy(lPath, "/
29cb0 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  tmp/", maxLen);.
29cc0 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
29cd0 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d    if( lPath[len-
29ce0 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c  1]!='/' ){.    l
29cf0 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
29d00 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29  th, "/", maxLen)
29d10 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72  ;.  }.  .  /* tr
29d20 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70  ansform the db p
29d30 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20  ath to a unique 
29d40 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  cache name */.  
29d50 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  dbLen = (int)str
29d60 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66  len(dbPath);.  f
29d70 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e  or( i=0; i<dbLen
29d80 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61   && (i+len+7)<ma
29d90 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xLen; i++){.    
29da0 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b  char c = dbPath[
29db0 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b  i];.    lPath[i+
29dc0 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f  len] = (c=='/')?
29dd0 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61  '_':c;.  }.  lPa
29de0 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a  th[i+len]='\0';.
29df0 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c    strlcat(lPath,
29e00 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65   ":auto:", maxLe
29e10 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  n);.  OSTRACE(("
29e20 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  GETLOCKPATH  pro
29e30 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
29e40 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68  pid=%d\n", lPath
29e50 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
29e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e70 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
29e80 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
29e90 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
29ea0 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
29eb0 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
29ec0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
29ed0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
29ee0 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
29ef0 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
29f00 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
29f10 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
29f20 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
29f30 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
29f40 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
29f50 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
29f60 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
29f70 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
29f80 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
29f90 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
29fa0 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
29fb0 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
29fc0 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
29fd0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
29fe0 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
29ff0 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
2a000 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
2a010 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
2a020 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
2a030 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
2a040 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
2a050 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
2a060 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2a070 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
2a080 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
2a090 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
2a0a0 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
2a0b0 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
2a0c0 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
2a0d0 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
2a0e0 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
2a0f0 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53 51  f( mkdir(buf, SQ
2a100 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
2a110 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
2a120 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  S) ){.          
2a130 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
2a140 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
2a150 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20  !=EEXIST ) {.   
2a160 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
2a170 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
2a180 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69  H  FAILED creati
2a190 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20  ng %s, ".       
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27                "'
2a1b0 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  %s' proxy lock p
2a1c0 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
2a1d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a1e0 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65         buf, stre
2a1f0 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50  rror(err), lockP
2a200 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
2a210 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2a220 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20  urn err;.       
2a230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
2a250 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  rt=i+1;.    }.  
2a260 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50    buf[i] = lockP
2a270 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53  ath[i];.  }.  OS
2a280 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
2a290 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
2a2a0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2a2b0 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  d\n", lockPath, 
2a2c0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65  getpid()));.  re
2a2d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a2e0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46   Create a new VF
2a2f0 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  S file descripto
2a300 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  r (stored in mem
2a310 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
2a320 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
2a330 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68  loc) and open th
2a340 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61  e file named "pa
2a350 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20  th" in the file 
2a360 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
2a370 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
2a380 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20  responsible not 
2a390 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67  only for closing
2a3a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2a3b0 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f  ptor.** but also
2a3c0 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
2a3d0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
2a3e0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ed with the file
2a3f0 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a   descriptor..*/.
2a400 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2a410 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a  CreateUnixFile(.
2a420 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a430 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  path,        /* 
2a440 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77  path for the new
2a450 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20   unixFile */.   
2a460 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69   unixFile **ppFi
2a470 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69  le,       /* uni
2a480 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e  xFile created an
2a490 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65  d returned by re
2a4a0 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c  f */.    int isl
2a4b0 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20  ockfile         
2a4c0 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f    /* if non zero
2a4d0 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69   missing dirs wi
2a4e0 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  ll be created */
2a4f0 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20  .) {.  int fd = 
2a500 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64 20  -1;.  int dirfd 
2a510 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
2a520 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
2a530 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a540 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
2a550 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
2a560 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
2a570 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
2a580 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
2a590 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2a5a0 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
2a5b0 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
2a5c0 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
2a5d0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
2a5e0 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
2a5f0 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
2a600 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
2a610 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
2a620 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
2a630 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
2a640 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
2a650 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
2a660 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
2a670 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
2a680 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
2a690 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
2a6a0 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
2a6b0 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
2a6c0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
2a6d0 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
2a6e0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
2a6f0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
2a700 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
2a710 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
2a720 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
2a730 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
2a740 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2a750 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
2a760 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
2a770 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
2a780 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2a7a0 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
2a7b0 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e   open(path, open
2a7c0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2a7d0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2a7e0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
2a7f0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2a800 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
2a810 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73  no==ENOENT && is
2a820 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
2a830 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74    if( proxyCreat
2a840 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20  eLockPath(path) 
2a850 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  == SQLITE_OK ){.
2a860 20 20 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65          fd = ope
2a870 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
2a880 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  s, SQLITE_DEFAUL
2a890 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
2a8a0 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NS);.      }.   
2a8b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
2a8c0 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61  0 ){.    openFla
2a8d0 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
2a8e0 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74     fd = open(pat
2a8f0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2a900 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2a910 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2a920 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2a930 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  no;.  }.  if( fd
2a940 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  <0 ){.    if( is
2a950 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
2a960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a970 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
2a980 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20  switch (terrno) 
2a990 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43  {.      case EAC
2a9a0 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74  CES:.        ret
2a9b0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2a9c0 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a  .      case EIO:
2a9d0 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
2a9e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2a9f0 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75  CK; /* even thou
2aa00 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e  gh it is the con
2aa10 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61  ch */.      defa
2aa20 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ult:.        ret
2aa30 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2aa40 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
2aa50 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20    }.  .  pNew = 
2aa60 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69  (unixFile *)sqli
2aa70 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2aa80 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
2aa90 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
2aaa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2aab0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OMEM;.    goto e
2aac0 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b  nd_create_proxy;
2aad0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
2aae0 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  ew, 0, sizeof(un
2aaf0 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77  ixFile));.  pNew
2ab00 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
2ab10 65 6e 46 6c 61 67 73 3b 0a 20 20 64 75 6d 6d 79  enFlags;.  dummy
2ab20 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
2ab30 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
2ab40 6f 46 69 6e 64 65 72 3b 0a 20 20 70 55 6e 75 73  oFinder;.  pUnus
2ab50 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70  ed->fd = fd;.  p
2ab60 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
2ab70 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65  openFlags;.  pNe
2ab80 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  w->pUnused = pUn
2ab90 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20  used;.  .  rc = 
2aba0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26  fillInUnixFile(&
2abb0 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69  dummyVfs, fd, di
2abc0 72 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69  rfd, (sqlite3_fi
2abd0 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20  le*)pNew, path, 
2abe0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
2abf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ac00 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
2ac10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ac20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f  ITE_OK;.  }.end_
2ac30 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20  create_proxy:   
2ac40 20 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f   .  close(fd); /
2ac50 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
2ac60 66 64 20 69 66 20 65 72 72 6f 72 2c 20 77 65 27  fd if error, we'
2ac70 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72  re already in er
2ac80 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ror */.  sqlite3
2ac90 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73  _free(pNew);.  s
2aca0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75  qlite3_free(pUnu
2acb0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sed);.  return r
2acc0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
2acd0 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75  ITE_TEST./* simu
2ace0 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
2acf0 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
2ad00 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
2ad10 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20  le paths */.int 
2ad20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
2ad30 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  um = 0;.#endif..
2ad40 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f  #define PROXY_HO
2ad50 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f  STIDLEN    16  /
2ad60 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73  * conch file hos
2ad70 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a  t id length */..
2ad80 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20  /* get the host 
2ad90 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75  ID via gethostuu
2ada0 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75  id(), pHostID mu
2adb0 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58  st point to PROX
2adc0 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20  Y_HOSTIDLEN .** 
2add0 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c  bytes of writabl
2ade0 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
2adf0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
2ae00 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20  HostID(unsigned 
2ae10 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69  char *pHostID, i
2ae20 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73  nt *pError){.  s
2ae30 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
2ae40 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
2ae50 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
2ae60 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  t */.  .  assert
2ae70 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  (PROXY_HOSTIDLEN
2ae80 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f   == sizeof(uuid_
2ae90 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48  t));.  memset(pH
2aea0 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f  ostID, 0, PROXY_
2aeb0 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 69 66  HOSTIDLEN);.  if
2aec0 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48  ( gethostuuid(pH
2aed0 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29  ostID, &timeout)
2aee0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   ){.    int err 
2aef0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
2af00 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
2af10 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
2af20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2af30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2af40 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2af50 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c  _TEST.  /* simul
2af60 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
2af70 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
2af80 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
2af90 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28  e paths */.  if(
2afa0 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
2afb0 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70  num != 0){.    p
2afc0 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61  HostID[0] = (cha
2afd0 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20  r)(pHostID[0] + 
2afe0 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68  (char)(sqlite3_h
2aff0 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46  ostid_num & 0xFF
2b000 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
2b010 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
2b020 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  E_OK;.}../* The 
2b030 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61  conch file conta
2b040 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20  ins the header, 
2b050 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b  host id and lock
2b060 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23   file path. */.#
2b070 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e  define PROXY_CON
2b080 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a  CHVERSION 2   /*
2b090 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20   1-byte header, 
2b0a0 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c  16-byte host id,
2b0b0 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65   path */.#define
2b0c0 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e   PROXY_HEADERLEN
2b0d0 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68      1   /* conch
2b0e0 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e   file header len
2b0f0 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  gth */.#define P
2b100 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20  ROXY_PATHINDEX  
2b110 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
2b120 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
2b130 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  EN).#define PROX
2b140 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28  Y_MAXCONCHLEN  (
2b150 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
2b160 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b  PROXY_HOSTIDLEN+
2b170 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20  MAXPATHLEN)../* 
2b180 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65  .** Takes an ope
2b190 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f  n conch file, co
2b1a0 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  pies the content
2b1b0 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20  s to a new path 
2b1c0 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a  and then moves .
2b1d0 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65  ** it back.  The
2b1e0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66   newly created f
2b1f0 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72  ile's file descr
2b200 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65  iptor is assigne
2b210 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63  d to the.** conc
2b220 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  h file structure
2b230 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65   and finally the
2b240 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20   original conch 
2b250 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2b260 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20  is .** closed.  
2b270 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  Returns zero if 
2b280 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73  successful..*/.s
2b290 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42  tatic int proxyB
2b2a0 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  reakConchLock(un
2b2b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
2b2c0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b  uid_t myHostID){
2b2d0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
2b2e0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2b2f0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2b300 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
2b310 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
2b320 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2b330 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2b340 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50  hFile;.  char tP
2b350 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
2b360 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58  .  char buf[PROX
2b370 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
2b380 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20    char *cPath = 
2b390 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
2b3a0 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65  ath;.  size_t re
2b3b0 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a  adLen = 0;.  siz
2b3c0 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b  e_t pathLen = 0;
2b3d0 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36  .  char errmsg[6
2b3e0 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66  4] = "";.  int f
2b3f0 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  d = -1;.  int rc
2b400 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 63 72 65   = -1;..  /* cre
2b410 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
2b420 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
2b430 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
2b440 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
2b450 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
2b460 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
2b470 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2b480 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
2b490 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
2b4a0 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
2b4b0 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
2b4c0 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
2b4d0 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
2b4e0 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d      sprintf(errm
2b4f0 73 67 2c 20 22 70 61 74 68 20 65 72 72 6f 72 20  sg, "path error 
2b500 28 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29  (len %d)", (int)
2b510 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  pathLen);.    go
2b520 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
2b530 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20  ;.  }.  /* read 
2b540 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e  the conch conten
2b550 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d  t */.  readLen =
2b560 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65   pread(conchFile
2b570 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f  ->h, buf, PROXY_
2b580 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
2b590 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50  .  if( readLen<P
2b5a0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29  ROXY_PATHINDEX )
2b5b0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72  {.    sprintf(er
2b5c0 72 6d 73 67 2c 20 22 72 65 61 64 20 65 72 72 6f  rmsg, "read erro
2b5d0 72 20 28 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e  r (len %d)", (in
2b5e0 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20  t)readLen);.    
2b5f0 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
2b600 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69  ck;.  }.  /* wri
2b610 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
2b620 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b   temporary break
2b630 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20   file */.  fd = 
2b640 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
2b650 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
2b660 43 4c 29 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  CL), SQLITE_DEFA
2b670 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2b680 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c  IONS);.  if( fd<
2b690 30 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 ){.    sprintf
2b6a0 28 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65  (errmsg, "create
2b6b0 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
2b6c0 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
2b6d0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2b6e0 20 7d 0a 20 20 69 66 28 20 70 77 72 69 74 65 28   }.  if( pwrite(
2b6f0 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e  fd, buf, readLen
2b700 2c 20 30 29 20 21 3d 20 72 65 61 64 4c 65 6e 20  , 0) != readLen 
2b710 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65  ){.    sprintf(e
2b720 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61  rrmsg, "write fa
2b730 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
2b740 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
2b750 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2b760 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61    if( rename(tPa
2b770 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20  th, cPath) ){.  
2b780 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
2b790 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64  , "rename failed
2b7a0 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
2b7b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
2b7c0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  aklock;.  }.  rc
2b7d0 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28   = 0;.  fprintf(
2b7e0 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73  stderr, "broke s
2b7f0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c  tale lock on %s\
2b800 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 63 6c  n", cPath);.  cl
2b810 6f 73 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ose(conchFile->h
2b820 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
2b830 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
2b840 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
2b850 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
2b860 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
2b870 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
2b880 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
2b890 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61        unlink(tPa
2b8a0 74 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  th);.      close
2b8b0 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (fd);.    }.    
2b8c0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2b8d0 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b  "failed to break
2b8e0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
2b8f0 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c  s, %s\n", cPath,
2b900 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20   errmsg);.  }.  
2b910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b920 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73   Take the reques
2b930 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ted lock on the 
2b940 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62  conch file and b
2b950 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63  reak a stale loc
2b960 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  k if the .** hos
2b970 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f  t id matches..*/
2b980 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2b990 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  yConchLock(unixF
2b9a0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
2b9b0 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74  _t myHostID, int
2b9c0 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72   lockType){.  pr
2b9d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2b9e0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
2b9f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2ba00 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2ba10 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
2ba20 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
2ba30 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
2ba40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ba50 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54  ITE_OK;.  int nT
2ba60 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75  ries = 0;.  stru
2ba70 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63  ct timespec conc
2ba80 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64  hModTime;.  .  d
2ba90 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
2baa0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2bab0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
2bac0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2bad0 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
2bae0 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
2baf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
2bb00 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
2bb10 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
2bb20 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
2bb30 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
2bb40 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
2bb50 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
2bb60 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
2bb70 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
2bb80 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
2bb90 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
2bba0 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
2bbb0 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
2bbc0 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
2bbd0 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
2bbe0 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
2bbf0 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
2bc00 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
2bc10 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
2bc20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
2bc30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
2bc40 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2bc50 20 20 20 20 69 66 28 20 66 73 74 61 74 28 63 6f      if( fstat(co
2bc60 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  nchFile->h, &buf
2bc70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
2bc80 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
2bc90 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
2bca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2bcb0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  RR_LOCK;.      }
2bcc0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
2bcd0 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20  ( nTries==1 ){. 
2bce0 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54         conchModT
2bcf0 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ime = buf.st_mti
2bd00 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20  mespec;.        
2bd10 75 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20  usleep(500000); 
2bd20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20  /* wait 0.5 sec 
2bd30 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
2bd40 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20   again*/.       
2bd50 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
2bd60 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
2bd70 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a  rt( nTries>1 );.
2bd80 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d        if( conchM
2bd90 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d  odTime.tv_sec !=
2bda0 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
2bdb0 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20  c.tv_sec || .   
2bdc0 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
2bdd0 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75  me.tv_nsec != bu
2bde0 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
2bdf0 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20  v_nsec ){.      
2be00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2be10 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BUSY;.      }.  
2be20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
2be30 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20  Tries==2 ){  .  
2be40 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b        char tBuf[
2be50 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
2be60 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  N];.        int 
2be70 6c 65 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e 63  len = pread(conc
2be80 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20  hFile->h, tBuf, 
2be90 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
2bea0 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  N, 0);.        i
2beb0 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  f( len<0 ){.    
2bec0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
2bed0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
2bee0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2bef0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2bf00 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  CK;.        }.  
2bf10 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52        if( len>PR
2bf20 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26  OXY_PATHINDEX &&
2bf30 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29   tBuf[0]==(char)
2bf40 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
2bf50 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ON){.          /
2bf60 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
2bf70 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f  e lock if the ho
2bf80 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61  st id doesn't ma
2bf90 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
2bfa0 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26   if( 0!=memcmp(&
2bfb0 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  tBuf[PROXY_HEADE
2bfc0 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
2bfd0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2bfe0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2bff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2c000 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
2c010 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
2c030 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
2c040 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20  k on short read 
2c050 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73  or a version mis
2c060 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
2c070 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c080 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
2c090 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
2c0a0 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  10000000); /* wa
2c0b0 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72  it 10 sec and tr
2c0c0 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
2c0d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
2c0e0 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20  inue; .      }. 
2c0f0 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65       .      asse
2c100 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b  rt( nTries==3 );
2c110 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72  .      if( 0==pr
2c120 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
2c130 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
2c140 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  D) ){.        rc
2c150 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c160 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79        if( lockTy
2c170 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
2c180 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
2c190 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
2c1a0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2c1b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2c1c0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
2c1d0 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20  LOCK);          
2c1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c1f0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
2c200 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
2c210 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2c220 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
2c230 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2c240 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
2c250 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c260 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72    }.  } while( r
2c270 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
2c280 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20  & nTries<3 );.  
2c290 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c2a0 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f  ./* Takes the co
2c2b0 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20  nch by taking a 
2c2c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
2c2d0 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
2c2e0 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20  s conch, if .** 
2c2f0 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d  lockPath is non-
2c300 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49  NULL, the host I
2c310 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  D and lock file 
2c320 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e  path must match.
2c330 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63    A NULL .** loc
2c340 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74  kPath means that
2c350 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e   the lockPath in
2c360 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2c370 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20  will be used if 
2c380 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73  the .** host IDs
2c390 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77   match, or a new
2c3a0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
2c3b0 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74  be generated aut
2c3c0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61  omatically .** a
2c3d0 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  nd written to th
2c3e0 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f  e conch file..*/
2c3f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2c400 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46  yTakeConch(unixF
2c410 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70  ile *pFile){.  p
2c420 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2c430 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
2c440 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2c450 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2c460 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69  Context; .  .  i
2c470 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
2c480 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ld!=0 ){.    ret
2c490 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c4a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
2c4b0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
2c4c0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
2c4d0 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79  e;.    uuid_t my
2c4e0 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20  HostID;.    int 
2c4f0 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
2c500 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f  char readBuf[PRO
2c510 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
2c520 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61  .    char lockPa
2c530 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
2c540 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f      char *tempLo
2c550 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ckPath = NULL;. 
2c560 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
2c570 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63  TE_OK;.    int c
2c580 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a  reateConch = 0;.
2c590 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61      int hostIdMa
2c5a0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tch = 0;.    int
2c5b0 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
2c5c0 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b    int tryOldLock
2c5d0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Path = 0;.    in
2c5e0 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61  t forceNewLockPa
2c5f0 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20  th = 0;.    .   
2c600 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
2c610 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
2c620 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
2c630 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
2c640 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63        (pCtx->loc
2c650 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74  kProxyPath ? pCt
2c660 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2c670 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
2c680 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72  tpid()));..    r
2c690 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74  c = proxyGetHost
2c6a0 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45  ID(myHostID, &pE
2c6b0 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rror);.    if( (
2c6c0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
2c6d0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
2c6e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
2c6f0 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
2c700 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
2c710 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nch;.    }.    r
2c720 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
2c730 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
2c740 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ID, SHARED_LOCK)
2c750 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2c760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c770 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
2c780 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nch;.    }.    /
2c790 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74  * read the exist
2c7a0 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  ing conch file *
2c7b0 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20  /.    readLen = 
2c7c0 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69  seekAndRead((uni
2c7d0 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  xFile*)conchFile
2c7e0 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52  , 0, readBuf, PR
2c7f0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29  OXY_MAXCONCHLEN)
2c800 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65  ;.    if( readLe
2c810 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
2c820 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45  I/O error: lastE
2c830 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
2c840 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20  AndRead */.     
2c850 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2c860 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c  o = conchFile->l
2c870 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
2c880 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2c890 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f  R_READ;.      go
2c8a0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
2c8b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2c8c0 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f  readLen<=(PROXY_
2c8d0 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
2c8e0 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20  HOSTIDLEN) || . 
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
2c900 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52  Buf[0]!=(char)PR
2c910 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
2c920 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73   ){.      /* a s
2c930 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72  hort read or ver
2c940 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d  sion format mism
2c950 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65  atch means we ne
2c960 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
2c970 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ew .      ** con
2c980 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  ch file. .      
2c990 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43  */.      createC
2c9a0 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  onch = 1;.    }.
2c9b0 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f      /* if the ho
2c9c0 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e  st id matches an
2c9d0 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  d the lock path 
2c9e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
2c9f0 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20  n the conch.    
2ca00 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20  ** we'll try to 
2ca10 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65  use the path the
2ca20 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20  re, if we can't 
2ca30 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20  open that path, 
2ca40 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65  we'll .    ** re
2ca50 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61  try with a new a
2ca60 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61  uto-generated pa
2ca70 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  th .    */.    d
2ca80 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77  o { /* in case w
2ca90 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67  e need to try ag
2caa0 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f  ain for an :auto
2cab0 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c  : named lock fil
2cac0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
2cad0 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20  !createConch && 
2cae0 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74  !forceNewLockPat
2caf0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73  h ){.        hos
2cb00 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63  tIdMatch = !memc
2cb10 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58  mp(&readBuf[PROX
2cb20 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
2cb30 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20  HostID, .       
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59             PROXY
2cb60 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20  _HOSTIDLEN);.   
2cb70 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63       /* if the c
2cb80 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f  onch has data co
2cb90 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
2cba0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ts */.        if
2cbb0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
2cbc0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
2cbd0 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d      /* for auto-
2cbe0 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b  named local lock
2cbf0 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63   file, just chec
2cc00 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  k the host ID an
2cc10 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20  d we'll.        
2cc20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f     ** use the lo
2cc30 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
2cc40 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64  th that's alread
2cc50 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20  y in there.     
2cc60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2cc70 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
2cc80 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
2cc90 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
2cca0 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52   = (readLen - PR
2ccb0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a  OXY_PATHINDEX);.
2ccc0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
2ccd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74           if( pat
2cce0 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e  hLen>=MAXPATHLEN
2ccf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cd00 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54    pathLen=MAXPAT
2cd10 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20  HLEN-1;.        
2cd20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2cd30 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74    memcpy(lockPat
2cd40 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
2cd50 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61  Y_PATHINDEX], pa
2cd60 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  thLen);.        
2cd70 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74      lockPath[pat
2cd80 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  hLen] = 0;.     
2cd90 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50         tempLockP
2cda0 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a  ath = lockPath;.
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4f              tryO
2cdc0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a  ldLockPath = 1;.
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
2cde0 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
2cdf0 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66  the lock path if
2ce00 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61   the conch is ta
2ce10 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
2ce20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
2ce30 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20  conch;.         
2ce40 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2ce50 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
2ce60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ce70 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78  && !strncmp(pCtx
2ce80 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
2ce90 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
2cea0 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20  PATHINDEX],.    
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cec0 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50         readLen-P
2ced0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a  ROXY_PATHINDEX).
2cee0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2cef0 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f       /* conch ho
2cf00 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68  st and lock path
2cf10 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
2cf20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
2cf30 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20  econch; .       
2cf40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2cf50 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68   .      /* if th
2cf60 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72  e conch isn't wr
2cf70 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e  itable and doesn
2cf80 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e  't match, we can
2cf90 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20  't take it */.  
2cfa0 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69      if( (conchFi
2cfb0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f  le->openFlags&O_
2cfc0 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20  RDWR) == 0 ){.  
2cfd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cfe0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
2cff0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
2d000 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
2d010 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68    .      /* eith
2d020 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64  er the conch did
2d030 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20  n't match or we 
2d040 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
2d050 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20   new one */.    
2d060 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
2d070 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
2d080 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f        proxyGetLo
2d090 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50  ckPath(pCtx->dbP
2d0a0 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d  ath, lockPath, M
2d0b0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
2d0c0 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68      tempLockPath
2d0d0 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20   = lockPath;.   
2d0e0 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61       /* create a
2d0f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63   copy of the loc
2d100 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66  k path _only_ if
2d110 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61   the conch is ta
2d120 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ken */.      }. 
2d130 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75       .      /* u
2d140 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68  pdate conch with
2d150 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28   host and path (
2d160 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69  this will fail i
2d170 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  f other process.
2d180 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73        ** has a s
2d190 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61  hared lock alrea
2d1a0 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74  dy), if the host
2d1b0 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65   id matches, use
2d1c0 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a   the big.      *
2d1d0 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a  * stick..      *
2d1e0 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73 28  /.      futimes(
2d1f0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55  conchFile->h, NU
2d200 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  LL);.      if( h
2d210 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21 63  ostIdMatch && !c
2d220 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20  reateConch ){.  
2d230 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46        if( conchF
2d240 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63  ile->pInode && c
2d250 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  onchFile->pInode
2d260 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
2d270 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
2d280 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
2d290 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2d2a0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
2d2b0 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
2d2c0 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72        ** same pr
2d2d0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
2d2e0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
2d2f0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lock. */.       
2d300 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
2d310 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
2d320 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a  lse {          .
2d330 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2d340 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  roxyConchLock(pF
2d350 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45  ile, myHostID, E
2d360 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2d370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2d390 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
2d3a0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
2d3b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2d3c0 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56  chFile, EXCLUSIV
2d3d0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
2d3e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2d3f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d400 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75      char writeBu
2d410 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  ffer[PROXY_MAXCO
2d420 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
2d430 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d   int writeSize =
2d440 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   0;.        .   
2d450 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72       writeBuffer
2d460 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58  [0] = (char)PROX
2d470 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a  Y_CONCHVERSION;.
2d480 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2d490 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
2d4a0 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
2d4b0 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
2d4c0 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20  STIDLEN);.      
2d4d0 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
2d4e0 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20  ProxyPath!=NULL 
2d4f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2d500 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  lcpy(&writeBuffe
2d510 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
2d520 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  X], pCtx->lockPr
2d530 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48  oxyPath, MAXPATH
2d540 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LEN);.        }e
2d550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2d560 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66  trlcpy(&writeBuf
2d570 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
2d580 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61  DEX], tempLockPa
2d590 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2d5a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d5b0 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50     writeSize = P
2d5c0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b  ROXY_PATHINDEX +
2d5d0 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75   strlen(&writeBu
2d5e0 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
2d5f0 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20  NDEX]);.        
2d600 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46  ftruncate(conchF
2d610 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a  ile->h, writeSiz
2d620 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
2d630 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69   unixWrite((sqli
2d640 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68  te3_file *)conch
2d650 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65  File, writeBuffe
2d660 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29  r, writeSize, 0)
2d670 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28  ;.        fsync(
2d680 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20  conchFile->h);. 
2d690 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
2d6a0 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f  created a new co
2d6b0 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75  nch file (not ju
2d6c0 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63  st updated the c
2d6d0 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20  ontents of a .  
2d6e0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20         ** valid 
2d6f0 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79  conch file), try
2d700 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65   to match the pe
2d710 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  rmissions of the
2d720 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
2d730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2d740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d750 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20   && createConch 
2d760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2d770 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2d780 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
2d790 3d 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  = fstat(pFile->h
2d7a0 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  , &buf);.       
2d7b0 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
2d7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64  .            mod
2d7d0 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e  e_t cmode = buf.
2d7e0 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52  st_mode&(S_IRUSR
2d7f0 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47  |S_IWUSR | S_IRG
2d800 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20  RP|S_IWGRP |.   
2d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d830 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49       S_IROTH|S_I
2d840 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20  WOTH);.         
2d850 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
2d860 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
2d870 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73  file R/W permiss
2d880 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69  ions, ignore fai
2d890 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  lure */.#ifndef 
2d8a0 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
2d8b0 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  UG.            f
2d8c0 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d  chmod(conchFile-
2d8d0 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73  >h, cmode);.#els
2d8e0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  e.            if
2d8f0 28 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  ( fchmod(conchFi
2d900 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d 30  le->h, cmode)!=0
2d910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d920 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
2d930 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
2d940 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2d950 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49  , "fchmod %o FAI
2d960 4c 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e  LED with %d %s\n
2d970 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2d980 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20           cmode, 
2d990 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
2d9a0 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ode));.         
2d9b0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2d9c0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2d9d0 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
2d9e0 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22  d %o SUCCEDED\n"
2d9f0 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  ,cmode);.       
2da00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2da10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2da20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
2da30 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
2da40 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2da50 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25  , "STAT FAILED[%
2da60 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22  d] with %d %s\n"
2da70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2da80 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65         err, code
2da90 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
2daa0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2dab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2dac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
2dad0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
2dae0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
2daf0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
2db00 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
2db10 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64  ;.      .    end
2db20 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20  _takeconch:.    
2db30 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
2db40 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25  SPROXY: CLOSE  %
2db50 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
2db60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2db70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
2db80 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b  le->openFlags ){
2db90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
2dba0 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64  le->h>=0 ){.#ifd
2dbb0 65 66 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f  ef STRICT_CLOSE_
2dbc0 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20  ERROR.          
2dbd0 69 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  if( close(pFile-
2dbe0 3e 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >h) ){.         
2dbf0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
2dc00 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2dc10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2dc20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
2dc30 53 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SE;.          }.
2dc40 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
2dc50 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
2dc60 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
2dc70 6b 20 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a  k fd if fail */.
2dc80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
2dc90 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
2dca0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  h = -1;.        
2dcb0 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43  int fd = open(pC
2dcc0 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
2dcd0 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  e->openFlags,.  
2dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcf0 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
2dd00 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2dd10 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  ONS);.        OS
2dd20 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
2dd30 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c  XY: OPEN  %d\n",
2dd40 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69   fd));.        i
2dd50 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
2dd60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
2dd70 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   fd;.        }el
2dd80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
2dd90 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2dda0 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45  _BKPT; /* SQLITE
2ddb0 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65  _BUSY? proxyTake
2ddc0 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20  Conch called.   
2ddd0 20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c          during l
2dde0 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ocking */.      
2ddf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2de00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2de10 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f  _OK && !pCtx->lo
2de20 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  ckProxy ){.     
2de30 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20     char *path = 
2de40 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74  tempLockPath ? t
2de50 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43  empLockPath : pC
2de60 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2de70 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  h;.        rc = 
2de80 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
2de90 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d  ile(path, &pCtx-
2dea0 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a  >lockProxy, 1);.
2deb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2dec0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
2ded0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
2dee0 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
2def0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2df00 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61  we couldn't crea
2df10 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  te the proxy loc
2df20 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  k file with the 
2df30 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  old lock file pa
2df40 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  th.           **
2df50 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69   so try again vi
2df60 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20  a auto-naming . 
2df70 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2df80 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c         forceNewL
2df90 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20  ockPath = 1;.   
2dfa0 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63         tryOldLoc
2dfb0 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  kPath = 0;.     
2dfc0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
2dfd0 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65  * go back to the
2dfe0 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61   do {} while sta
2dff0 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67  rt point, try ag
2e000 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ain */.        }
2e010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e030 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
2e040 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f  eed to make a co
2e050 70 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65  py of path if we
2e060 20 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76   extracted the v
2e070 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a  alue.         **
2e080 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20   from the conch 
2e090 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68  file or the path
2e0a0 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f   was allocated o
2e0b0 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20  n the stack.    
2e0c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e0d0 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  if( tempLockPath
2e0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
2e0f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2e100 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
2e110 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50  Dup(0, tempLockP
2e120 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
2e130 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
2e140 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
2e150 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2e160 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2e170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
2e1b0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b  ->conchHeld = 1;
2e1c0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
2e1d0 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
2e1e0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d  Proxy->pMethod =
2e1f0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
2e200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  ){.          afp
2e210 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2e220 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20  afpCtx;.        
2e230 20 20 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c    afpCtx = (afpL
2e240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
2e250 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d  pCtx->lockProxy-
2e260 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2e270 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74  .          afpCt
2e280 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78  x->dbPath = pCtx
2e290 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
2e2a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e2b0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2e2c0 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65    conchFile->pMe
2e2d0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
2e2e0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2e2f0 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29  chFile, NO_LOCK)
2e300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e310 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f  OSTRACE(("TAKECO
2e320 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63  NCH  %d %s\n", c
2e330 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
2e340 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d              rc==
2e350 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22  SQLITE_OK?"ok":"
2e360 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
2e370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e380 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20  } while (1); /* 
2e390 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20  in case we need 
2e3a0 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61 75  to retry the :au
2e3b0 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20  to: lock file - 
2e3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e3d0 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e    ** we should n
2e3e0 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65 78  ever get here ex
2e3f0 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63 6f  cept via the 'co
2e400 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f  ntinue' call. */
2e410 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
2e420 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c   pFile holds a l
2e430 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66  ock on a conch f
2e440 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ile, then releas
2e450 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e that lock..*/.
2e460 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2e470 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69  ReleaseConch(uni
2e480 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
2e490 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e4a0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
2e4b0 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  Subroutine retur
2e4c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78  n code */.  prox
2e4d0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2e4e0 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c  *pCtx;  /* The l
2e4f0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  ocking context f
2e500 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  or the proxy loc
2e510 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  k */.  unixFile 
2e520 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
2e530 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2e540 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
2e550 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79  .  pCtx = (proxy
2e560 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2e570 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2e580 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46  ontext;.  conchF
2e590 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2e5a0 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45  hFile;.  OSTRACE
2e5b0 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  (("RELEASECONCH 
2e5c0 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
2e5d0 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  d\n", conchFile-
2e5e0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
2e5f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2e600 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
2e610 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
2e620 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20  to:"), .        
2e630 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20     getpid()));. 
2e640 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
2e650 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63  Held>0 ){.    rc
2e660 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2e670 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
2e680 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2e690 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
2e6a0 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63  );.  }.  pCtx->c
2e6b0 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
2e6c0 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53  OSTRACE(("RELEAS
2e6d0 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
2e6e0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
2e6f0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
2e700 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
2e710 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
2e720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e730 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
2e740 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
2e750 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65  se file, compute
2e760 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73   the name of its
2e770 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20   conch file..** 
2e780 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20  Store the conch 
2e790 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f  filename in memo
2e7a0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
2e7b0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2e7c0 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e  )..** Make *pCon
2e7d0 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20  chPath point to 
2e7e0 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52  the new name.  R
2e7f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2e800 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
2e810 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2e820 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69   unable to obtai
2e830 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  n memory..**.** 
2e840 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
2e850 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
2e860 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
2e870 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
2e880 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65  .** space is eve
2e890 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  ntually freed..*
2e8a0 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68  *.** *pConchPath
2e8b0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
2e8c0 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
2e8d0 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
2e8e0 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
2e8f0 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f  nt proxyCreateCo
2e900 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72  nchPathname(char
2e910 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
2e920 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20  *pConchPath){.  
2e930 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e950 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2e960 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e  .  int len = (in
2e970 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
2e980 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64  ; /* Length of d
2e990 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
2e9a0 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63   - dbPath */.  c
2e9b0 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20  har *conchPath; 
2e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e9d0 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  buffer in which 
2e9e0 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e  to construct con
2e9f0 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a  ch name */..  /*
2ea00 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
2ea10 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
2ea20 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69  lename and initi
2ea30 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74  alize the name t
2ea40 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20  o.  ** the name 
2ea50 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
2ea60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2ea70 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74  /  .  *pConchPat
2ea80 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20  h = conchPath = 
2ea90 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2eaa0 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b  malloc(len + 8);
2eab0 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68  .  if( conchPath
2eac0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2ead0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2eae0 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e    }.  memcpy(con
2eaf0 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20  chPath, dbPath, 
2eb00 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20  len+1);.  .  /* 
2eb10 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22  now insert a "."
2eb20 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74   before the last
2eb30 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a   / character */.
2eb40 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29    for( i=(len-1)
2eb50 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20  ; i>=0; i-- ){. 
2eb60 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68     if( conchPath
2eb70 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
2eb80 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65    i++;.      bre
2eb90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
2eba0 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27  conchPath[i]='.'
2ebb0 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65  ;.  while ( i<le
2ebc0 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61  n ){.    conchPa
2ebd0 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69  th[i+1]=dbPath[i
2ebe0 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  ];.    i++;.  }.
2ebf0 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65  .  /* append the
2ec00 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78   "-conch" suffix
2ec10 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   to the file */.
2ec20 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50    memcpy(&conchP
2ec30 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63  ath[i+1], "-conc
2ec40 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74  h", 7);.  assert
2ec50 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f  ( (int)strlen(co
2ec60 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b  nchPath) == len+
2ec70 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  7 );..  return S
2ec80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
2ec90 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63   Takes a fully c
2eca0 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20  onfigured proxy 
2ecb0 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e  locking-style un
2ecc0 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74  ix file and swit
2ecd0 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61  ches.** the loca
2ece0 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
2ecf0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2ed00 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50  switchLockProxyP
2ed10 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
2ed20 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
2ed30 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
2ed40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2ed50 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
2ed60 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
2ed70 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2ed80 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50  xt;.  char *oldP
2ed90 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath = pCtx->lock
2eda0 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74  ProxyPath;.  int
2edb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2edc0 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ..  if( pFile->e
2edd0 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
2ede0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
2edf0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
2ee00 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67    ..  /* nothing
2ee10 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61   to do if the pa
2ee20 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74  th is NULL, :aut
2ee30 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68  o: or matches th
2ee40 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  e existing path 
2ee50 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  */.  if( !path |
2ee60 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
2ee70 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
2ee80 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20   ":auto:") ||.  
2ee90 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73    (oldPath && !s
2eea0 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20  trncmp(oldPath, 
2eeb0 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  path, MAXPATHLEN
2eec0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
2eed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2eee0 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
2eef0 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
2ef00 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
2ef10 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
2ef20 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43  oxy=NULL;.    pC
2ef30 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
2ef40 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  0;.    if( lockP
2ef50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  roxy!=NULL ){.  
2ef60 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79      rc=lockProxy
2ef70 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
2ef80 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
2ef90 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
2efa0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2efb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
2efc0 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
2efd0 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  roxy);.    }.   
2efe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c   sqlite3_free(ol
2eff0 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  dPath);.    pCtx
2f000 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2f010 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2f020 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a  p(0, path);.  }.
2f030 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
2f040 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69  }../*.** pFile i
2f050 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  s a file that ha
2f060 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
2f070 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63   a prior xOpen c
2f080 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20  all.  dbPath.** 
2f090 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  is a string buff
2f0a0 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50  er at least MAXP
2f0b0 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74  ATHLEN+1 charact
2f0c0 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  ers in size..**.
2f0d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f0e0 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d  find the filenam
2f0f0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
2f100 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74  h pFile and writ
2f110 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50  es it.** int dbP
2f120 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
2f130 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  nt proxyGetDbPat
2f140 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
2f150 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
2f160 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66  ar *dbPath){.#if
2f170 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2f180 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  __).  if( pFile-
2f190 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
2f1a0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2f1b0 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65   /* afp style ke
2f1c0 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  eps a reference 
2f1d0 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69  to the db path i
2f1e0 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66  n the filePath f
2f1f0 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20  ield .    ** of 
2f200 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  the struct */.  
2f210 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
2f220 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
2f230 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2f240 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
2f250 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64  );.    strlcpy(d
2f260 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b  bPath, ((afpLock
2f270 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2f280 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2f290 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58  xt)->dbPath, MAX
2f2a0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c  PATHLEN);.  } el
2f2b0 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  se.#endif.  if( 
2f2c0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
2f2d0 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
2f2e0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f  ods ){.    /* do
2f2f0 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65  t lock style use
2f300 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
2f310 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
2f320 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20  he dot lock.    
2f330 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  ** file path */.
2f340 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
2f350 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69  rlen((char *)pFi
2f360 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2f370 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54  xt) - strlen(DOT
2f380 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20  LOCK_SUFFIX);.  
2f390 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c    memcpy(dbPath,
2f3a0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
2f3b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
2f3c0 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73  len + 1);.  }els
2f3d0 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74  e{.    /* all ot
2f3e0 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20 74  her styles use t
2f3f0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
2f400 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
2f410 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  db file path */.
2f420 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
2f430 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
2f440 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2f450 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
2f460 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
2f470 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
2f480 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2f490 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  t, MAXPATHLEN);.
2f4a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2f4b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2f4c0 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64   Takes an alread
2f4d0 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78  y filled in unix
2f4e0 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73   file and alters
2f4f0 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20   it so all file 
2f500 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c  locking .** will
2f510 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
2f520 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79   the local proxy
2f530 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65   lock file.  The
2f540 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
2f550 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76  s.** are preserv
2f560 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  ed in the lockin
2f570 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61  g context so tha
2f580 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65  t they can be re
2f590 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74  stored and .** t
2f5a0 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75 72  he unix structur
2f5b0 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e  e properly clean
2f5c0 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74  ed up at close t
2f5d0 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69  ime:.**  ->locki
2f5e0 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e  ngContext.**  ->
2f5f0 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69  pMethod.*/.stati
2f600 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
2f610 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
2f620 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
2f630 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
2f640 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2f650 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2f660 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58   char dbPath[MAX
2f670 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20  PATHLEN+1];     
2f680 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2f690 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2f6a0 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  /.  char *lockPa
2f6b0 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72  th=NULL;.  int r
2f6c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f6d0 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65   .  if( pFile->e
2f6e0 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
2f6f0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
2f700 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
2f710 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  .  proxyGetDbPat
2f720 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69  hForUnixFile(pFi
2f730 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69  le, dbPath);.  i
2f740 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
2f750 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
2f760 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
2f770 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  o:") ){.    lock
2f780 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  Path=NULL;.  }el
2f790 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68  se{.    lockPath
2f7a0 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20  =(char *)path;. 
2f7b0 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28   }.  .  OSTRACE(
2f7c0 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
2f7d0 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
2f7e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
2f7f0 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74          (lockPat
2f800 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22  h ? lockPath : "
2f810 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
2f820 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20  ()));..  pCtx = 
2f830 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
2f840 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
2f850 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
2f860 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2f870 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
2f880 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c   memset(pCtx, 0,
2f890 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b   sizeof(*pCtx));
2f8a0 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72  ..  rc = proxyCr
2f8b0 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
2f8c0 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d  e(dbPath, &pCtx-
2f8d0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
2f8e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f8f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
2f900 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
2f910 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  File(pCtx->conch
2f920 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d  FilePath, &pCtx-
2f930 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a  >conchFile, 0);.
2f940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f950 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20 28  TE_CANTOPEN && (
2f960 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  (pFile->openFlag
2f970 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29 20  s&O_RDWR) == 0) 
2f980 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 28  ){.      /* if (
2f990 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c 61 67  a) the open flag
2f9a0 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52  s are not O_RDWR
2f9b0 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63 68 20  , (b) the conch 
2f9c0 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61 6e 64  isn't there, and
2f9d0 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20 74 68  .      ** (c) th
2f9e0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 69 73  e file system is
2f9f0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e   read-only, then
2fa00 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69   enable no-locki
2fa10 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20 20 20  ng access..     
2fa20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65 20 4f   ** Ugh, since O
2fa30 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20  _RDONLY==0x0000 
2fa40 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f 5f 52  we test for !O_R
2fa50 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78 4f 70  DWR since unixOp
2fa60 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20 20 20  en asserts.     
2fa70 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c 61   ** that openFla
2fa80 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c  gs will have onl
2fa90 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c  y one of O_RDONL
2faa0 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20  Y or O_RDWR..   
2fab0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75     */.      stru
2fac0 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2fad0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  ;.      struct s
2fae0 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20  tat conchInfo;. 
2faf0 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c       int goLockl
2fb00 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ess = 0;..      
2fb10 69 66 28 20 73 74 61 74 28 70 43 74 78 2d 3e 63  if( stat(pCtx->c
2fb20 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 63  onchFilePath, &c
2fb30 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20  onchInfo) == -1 
2fb40 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
2fb50 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  err = errno;.   
2fb60 20 20 20 20 20 69 66 28 20 28 65 72 72 3d 3d 45       if( (err==E
2fb70 4e 4f 45 4e 54 29 20 26 26 20 28 73 74 61 74 66  NOENT) && (statf
2fb80 73 28 64 62 50 61 74 68 2c 20 26 66 73 49 6e 66  s(dbPath, &fsInf
2fb90 6f 29 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20  o) != -1) ){.   
2fba0 20 20 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73         goLockles
2fbb0 73 20 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c  s = (fsInfo.f_fl
2fbc0 61 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20  ags&MNT_RDONLY) 
2fbd0 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20  == MNT_RDONLY;. 
2fbe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fbf0 0a 20 20 20 20 20 20 69 66 28 20 67 6f 4c 6f 63  .      if( goLoc
2fc00 6b 6c 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  kless ){.       
2fc10 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2fc20 20 3d 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f   = -1; /* read o
2fc30 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73  nly FS/ lockless
2fc40 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2fc50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2fc60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a    }.    }.  }  .
2fc70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fc80 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20  _OK && lockPath 
2fc90 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  ){.    pCtx->loc
2fca0 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
2fcb0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2fcc0 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  lockPath);.  }..
2fcd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fce0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  _OK ){.    pCtx-
2fcf0 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74 65  >dbPath = sqlite
2fd00 33 44 62 53 74 72 44 75 70 28 30 2c 20 64 62 50  3DbStrDup(0, dbP
2fd10 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ath);.    if( pC
2fd20 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c  tx->dbPath==NULL
2fd30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2fd40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2fd50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2fd60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fd70 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20    /* all memory 
2fd80 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72  is allocated, pr
2fd90 6f 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64  oxys are created
2fda0 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a   and assigned, .
2fdb0 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68      ** switch th
2fdc0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
2fdd0 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
2fde0 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a  en return..    *
2fdf0 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c  /.    pCtx->oldL
2fe00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2fe10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2fe20 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
2fe30 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2fe40 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74   = pCtx;.    pCt
2fe50 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20  x->pOldMethod = 
2fe60 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a  pFile->pMethod;.
2fe70 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
2fe80 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  od = &proxyIoMet
2fe90 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2fea0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
2feb0 63 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20  chFile ){ .     
2fec0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
2fed0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
2fee0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
2fef0 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  *)pCtx->conchFil
2ff00 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
2ff10 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
2ff20 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  chFile);.    }. 
2ff30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ff40 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2ff50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
2ff60 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
2ff70 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20  chFilePath); .  
2ff80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ff90 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Ctx);.  }.  OSTR
2ffa0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
2ffb0 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c    %d %s\n", pFil
2ffc0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
2ffd0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
2ffe0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
2fff0 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
30000 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
30010 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65  s routine handle
30020 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  s sqlite3_file_c
30030 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74  ontrol() calls t
30040 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63  hat are specific
30050 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63  .** to proxy loc
30060 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
30070 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
30080 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
30090 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
300a0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
300b0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
300c0 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
300d0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
300e0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
300f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
30100 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66  le*)id;.      if
30110 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
30120 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
30130 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ods ){.        p
30140 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
30150 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
30160 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
30170 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
30180 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
30190 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
301a0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
301b0 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
301c0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
301d0 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
301e0 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d   **)pArg = pCtx-
301f0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
30200 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30210 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74           *(const
30220 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
30230 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c  ":auto: (not hel
30240 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d)";.        }. 
30250 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
30260 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
30270 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c  ar **)pArg = NUL
30280 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
30290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
302a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
302b0 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
302c0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
302d0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
302e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
302f0 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  )id;.      int r
30300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30310 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79       int isProxy
30320 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e  Style = (pFile->
30330 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
30340 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20  yIoMethods);.   
30350 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c     if( pArg==NUL
30360 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72  L || (const char
30370 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20   *)pArg==0 ){.  
30380 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
30390 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
303a0 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20      /* turn off 
303b0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20  proxy locking - 
303c0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f  not supported */
303d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
303e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53  SQLITE_ERROR /*S
303f0 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20  QLITE_PROTOCOL? 
30400 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f  SQLITE_MISUSE?*/
30410 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30420 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
30430 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
30440 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f  king - already o
30450 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20  ff - NOOP */.   
30460 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30470 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
30480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30490 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
304a0 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63   *proxyPath = (c
304b0 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67  onst char *)pArg
304c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
304d0 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
304e0 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63          proxyLoc
304f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
30500 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  x = .           
30510 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
30520 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
30530 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
30540 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74 72          if( !str
30550 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f  cmp(pArg, ":auto
30560 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  :") .           
30570 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  || (pCtx->lockPr
30580 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20 20  oxyPath &&.     
30590 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e 63            !strnc
305a0 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
305b0 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74  xyPath, proxyPat
305c0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a  h, MAXPATHLEN)).
305d0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
305e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
305f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30610 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63        rc = switc
30620 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70  hLockProxyPath(p
30630 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
30640 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30660 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
30670 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  n proxy file loc
30680 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
30690 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
306a0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46  sformUnixFile(pF
306b0 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ile, proxyPath);
306c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
306d0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
306e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  rc;.    }.    de
306f0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
30700 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
30710 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73  The call assures
30720 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64   that only valid
30730 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e   opcodes are sen
30740 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t */.    }.  }. 
30750 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
30760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30770 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
30780 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69  Within this divi
30790 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69  sion (the proxyi
307a0 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ng locking imple
307b0 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70  mentation) the p
307c0 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f  rocedures.** abo
307d0 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72  ve this point ar
307e0 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e  e all utilities.
307f0 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74    The lock-relat
30800 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ed methods of th
30810 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  e.** proxy-locki
30820 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ng sqlite3_io_me
30830 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c  thod object foll
30840 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ow..*/.../*.** T
30850 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
30860 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
30870 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
30880 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
30890 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
308a0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
308b0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
308c0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
308d0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
308e0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
308f0 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
30900 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
30910 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
30920 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
30930 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
30940 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
30950 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
30960 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
30970 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
30980 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
30990 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
309a0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
309b0 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69  pResOut) {.  uni
309c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
309d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
309e0 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
309f0 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
30a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
30a20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
30a30 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
30a40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
30a50 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
30a60 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
30a70 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
30a80 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
30a90 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
30aa0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
30ab0 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70   return proxy->p
30ac0 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65  Method->xCheckRe
30ad0 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69  servedLock((sqli
30ae0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
30af0 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d   pResOut);.    }
30b00 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65  else{ /* conchHe
30b10 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
30b20 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ss */.      pRes
30b30 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out=0;.    }.  }
30b40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30b50 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
30b60 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
30b70 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
30b80 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
30b90 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
30ba0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
30bb0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
30bc0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
30bd0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
30be0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
30bf0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
30c00 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
30c10 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
30c20 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
30c30 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
30c40 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
30c50 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
30c60 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
30c70 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
30c80 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
30c90 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
30ca0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
30cb0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
30cc0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
30cd0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
30ce0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
30cf0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
30d00 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
30d10 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
30d20 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
30d30 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
30d40 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
30d50 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
30d60 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
30d70 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
30d80 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
30d90 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
30da0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
30db0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
30dc0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
30dd0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
30de0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
30df0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
30e00 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
30e10 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
30e20 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
30e30 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
30e40 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
30e50 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
30e60 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
30e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30e80 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
30e90 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
30ea0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
30eb0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
30ec0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
30ed0 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
30ee0 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
30ef0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
30f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
30f10 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
30f20 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
30f30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
30f40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
30f50 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
30f60 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
30f70 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
30f80 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
30f90 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
30fa0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
30fb0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
30fc0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
30fd0 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a  xy, eFileLock);.
30fe0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
30ff0 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e  leLock = proxy->
31000 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  eFileLock;.    }
31010 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63  else{.      /* c
31020 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20  onchHeld < 0 is 
31030 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
31040 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
31050 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
31060 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
31070 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
31080 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
31090 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
310a0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
310b0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
310c0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
310d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
310e0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
310f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
31100 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
31110 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
31120 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
31130 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
31140 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
31150 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
31160 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
31170 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
31180 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
31190 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
311a0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
311b0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
311c0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
311d0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
311e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
311f0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31200 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
31210 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31220 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31230 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66  gContext;.    if
31240 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
31250 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  d>0 ){.      uni
31260 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
31270 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
31280 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
31290 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
312a0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
312b0 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f  *)proxy, eFileLo
312c0 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ck);.      pFile
312d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72  ->eFileLock = pr
312e0 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  oxy->eFileLock;.
312f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31300 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
31310 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
31320 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
31330 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31340 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68   Close a file th
31350 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f  at uses proxy lo
31360 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
31370 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
31380 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
31390 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
313a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
313b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
313c0 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  d;.    proxyLock
313d0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
313e0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
313f0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
31400 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
31410 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
31420 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
31430 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
31440 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
31450 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
31460 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72  hFile;.    int r
31470 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31480 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b     .    if( lock
31490 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
314a0 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
314b0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
314c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
314d0 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43  ockProxy, NO_LOC
314e0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
314f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31500 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
31510 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
31520 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
31530 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  e*)lockProxy);. 
31540 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
31550 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
31560 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
31570 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43  Proxy);.      pC
31580 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  tx->lockProxy = 
31590 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
315a0 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20   conchFile ){.  
315b0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
315c0 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20  nchHeld ){.     
315d0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c     rc = proxyRel
315e0 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  easeConch(pFile)
315f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31600 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31610 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
31620 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
31630 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
31640 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
31650 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
31660 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
31670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
31680 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  ree(conchFile);.
31690 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
316a0 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63  3_free(pCtx->loc
316b0 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
316c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
316d0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
316e0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
316f0 66 72 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74  free(pCtx->dbPat
31700 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
31710 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
31720 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
31730 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
31740 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
31750 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
31760 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
31770 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
31780 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
31790 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
317a0 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
317b0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
317c0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
317d0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
317e0 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
317f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31800 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
31810 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
31820 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
31830 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
31840 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
31850 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
31860 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
31870 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
31880 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
31890 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
318a0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
318b0 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
318c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
318d0 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
318e0 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
318f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
31900 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
31910 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
31920 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
31930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31940 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
31950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31990 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
319a0 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
319b0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
319c0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
319d0 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
319e0 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
319f0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
31a00 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
31a10 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
31a20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
31a30 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
31a40 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
31a50 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
31a60 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
31a70 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
31a80 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
31a90 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
31aa0 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
31ab0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
31ac0 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
31ad0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
31ae0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
31af0 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
31b00 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
31b10 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
31b20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
31b30 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
31b40 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
31b50 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
31b60 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
31b70 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
31b80 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
31b90 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
31ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
31bb0 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
31bc0 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
31bd0 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
31be0 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
31bf0 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
31c00 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
31c10 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
31c20 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
31c30 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
31c40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31c50 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
31c60 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e  the "finder" fun
31c70 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74  ction.  (pAppDat
31c80 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
31c90 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61  o a pointer beca
31ca0 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43  use.  ** silly C
31cb0 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69  90 rules prohibi
31cc0 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62  t a void* from b
31cd0 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66  eing cast to a f
31ce0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a  unction pointer.
31cf0 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68    ** and so we h
31d00 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67  ave to go throug
31d10 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  h the intermedia
31d20 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76  te pointer to av
31d30 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
31d40 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
31d50 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
31d60 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a  errors on GCC.).
31d70 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49    **.  ** The FI
31d80 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74  NDER parameter t
31d90 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
31da0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
31db0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
31dc0 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
31dd0 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
31de0 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
31df0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
31e00 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
31e10 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
31e20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
31e30 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
31e40 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
31e50 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
31e60 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
31e70 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
31e80 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
31e90 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
31ea0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
31eb0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
31ec0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
31ed0 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
31ee0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
31ef0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
31f00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
31f10 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
31f20 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
31f30 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
31f40 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
31f50 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
31f60 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
31f70 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
31f80 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
31f90 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
31fa0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
31fb0 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
31fc0 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
31fd0 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
31fe0 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
31ff0 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
32000 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
32010 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
32020 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
32030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32040 20 20 20 20 5c 0a 20 20 20 20 32 2c 20 20 20 20      \.    2,    
32050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32060 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
32070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32080 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
32090 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
320a0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320c0 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
320d0 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
320e0 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
320f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
32100 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
32110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
32120 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
32130 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
32140 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
32150 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
32160 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
32170 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
32180 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20  (void*)&FINDER, 
32190 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
321a0 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
321b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
321c0 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
321d0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
321e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321f0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
32200 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
32210 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
32220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32230 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
32240 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
32250 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32270 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
32280 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
32290 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
322a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
322b0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
322c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
322d0 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
322e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
322f0 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
32300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
32310 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
32320 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
32330 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
32340 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
32350 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
32360 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
32370 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
32380 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
32390 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
323a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
323b0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
323c0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
323d0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
323e0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
323f0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
32400 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
32410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32420 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
32430 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
32440 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
32450 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
32460 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
32470 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
32480 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
32490 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
324a0 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
324b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
324c0 52 65 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  Rename */       
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
324e0 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54      unixCurrentT
324f0 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
32500 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
32510 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20  /           \.  
32520 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  }..  /*.  ** All
32530 20 64 65 66 61 75 6c 74 20 56 46 53 65 73 20 66   default VFSes f
32540 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74  or unix are cont
32550 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  ained in the fol
32560 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20  lowing array..  
32570 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
32580 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  t the sqlite3_vf
32590 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  s.pNext field of
325a0 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20   the VFS object 
325b0 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a  is modified.  **
325c0 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63   by the SQLite c
325d0 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56 46 53  ore when the VFS
325e0 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 20   is registered. 
325f0 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   So the followin
32600 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e  g.  ** array can
32610 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20  not be const..  
32620 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  */.  static sqli
32630 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d  te3_vfs aVfs[] =
32640 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   {.#if SQLITE_EN
32650 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
32660 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b  LE && (OS_VXWORK
32670 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  S || defined(__A
32680 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49  PPLE__)).    UNI
32690 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20  XVFS("unix",    
326a0 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f        autolockIo
326b0 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a  Finder ),.#else.
326c0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
326d0 78 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73  x",          pos
326e0 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ixIoFinder ),.#e
326f0 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53  ndif.    UNIXVFS
32700 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20  ("unix-none",   
32710 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
32720 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
32730 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20  "unix-dotfile", 
32740 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
32750 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ),.#if OS_VXWOR
32760 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  KS.    UNIXVFS("
32770 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20  unix-namedsem", 
32780 73 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  semIoFinder ),.#
32790 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
327a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
327b0 53 54 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46  STYLE.    UNIXVF
327c0 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20  S("unix-posix", 
327d0 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72     posixIoFinder
327e0 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   ),.#if !OS_VXWO
327f0 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28  RKS.    UNIXVFS(
32800 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20  "unix-flock",   
32810 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29   flockIoFinder )
32820 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ,.#endif.#endif.
32830 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
32840 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
32850 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
32860 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46  LE__).    UNIXVF
32870 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20  S("unix-afp",   
32880 20 20 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29     afpIoFinder )
32890 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
328a0 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e  nix-nfs",      n
328b0 66 73 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fsIoFinder ),.  
328c0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
328d0 70 72 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79  proxy",    proxy
328e0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
328f0 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  if.  };.  unsign
32900 65 64 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  ed int i;       
32910 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
32920 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69  er */..  /* Regi
32930 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 20 64  ster all VFSes d
32940 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 61 56  efined in the aV
32950 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  fs[] array */.  
32960 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65  for(i=0; i<(size
32970 6f 66 28 61 56 66 73 29 2f 73 69 7a 65 6f 66 28  of(aVfs)/sizeof(
32980 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 20 69  sqlite3_vfs)); i
32990 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
329a0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 61  _vfs_register(&a
329b0 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20  Vfs[i], i==0);. 
329c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
329d0 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_OK; .}../*.**
329e0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70   Shutdown the op
329f0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
32a00 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
32a10 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
32a20 79 73 74 65 6d 73 20 6d 69 67 68 74 20 6e 65 65  ystems might nee
32a30 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65  d to do some cle
32a40 61 6e 75 70 20 69 6e 20 74 68 69 73 20 72 6f 75  anup in this rou
32a50 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65  tine,.** to rele
32a60 61 73 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ase dynamically 
32a70 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74  allocated object
32a80 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75  s.  But not on u
32a90 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  nix..** This rou
32aa0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
32ab0 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74  for unix..*/.int
32ac0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
32ad0 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e  void){ .  return
32ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20   SQLITE_OK; .}. 
32af0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
32b00 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a           E_OS_UNIX */.