/ Hex Artifact Content
Login

Artifact 12051d37e533cdaa8bb13c9d9fe2a13e08552187:


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 49 6e  );.    releaseIn
107c0 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70  odeInfo(pFile->p
107d0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 75 6e 69 78  Inode);.    unix
107e0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
107f0 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
10800 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
10810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10820 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
10830 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
10840 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
10850 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
10860 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
10870 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
10880 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
10890 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
108a0 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
108b0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
108c0 2a 2a 2a 2a 2a 2a 0a 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 2a 2f 0a 0a 0a 2f 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 2a 0a 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 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
10990 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
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 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
109c0 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
109d0 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
109e0 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
109f0 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
10a00 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
10a10 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
10a20 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
10a30 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
10a40 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
10a50 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
10a60 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
10a70 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
10a80 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
10a90 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
10aa0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
10ab0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
10ac0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
10ad0 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
10ae0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
10af0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
10b00 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
10b10 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
10b20 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
10b30 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
10b40 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
10b50 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
10b60 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
10b70 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
10b80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
10b90 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
10ba0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10bb0 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
10bc0 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
10bd0 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
10be0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
10bf0 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
10c00 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
10c10 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
10c20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
10c30 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
10c40 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
10c50 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
10c60 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
10c70 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
10c80 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
10c90 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
10ca0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
10cb0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
10cc0 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
10cd0 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
10ce0 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
10cf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10d00 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
10d10 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
10d20 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
10d30 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
10d40 20 20 69 6e 74 20 66 64 3b 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 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
10d70 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
10d80 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
10d90 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
10da0 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
10db0 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
10dc0 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
10dd0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
10de0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
10df0 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
10e00 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
10e10 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
10e20 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
10e30 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
10e40 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10e50 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
10e60 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
10e70 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
10e80 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
10e90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
10ea0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
10eb0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10ec0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
10ed0 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
10ee0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
10ef0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
10f00 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
10f10 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
10f20 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
10f30 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
10f40 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
10f50 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
10f60 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
10f70 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
10f80 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
10f90 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
10fa0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
10fb0 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
10fc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
10fd0 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
10fe0 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
10ff0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
11000 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
11010 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
11020 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
11030 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
11040 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
11050 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
11060 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
11070 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
11080 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
11090 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
110a0 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
110b0 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
110c0 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
110d0 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
110e0 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
110f0 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
11100 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
11110 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
11120 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
11130 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
11140 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
11150 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
11160 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
11170 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
11180 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
11190 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
111a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
111b0 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
111c0 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
111d0 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
111e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
111f0 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
11200 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
11210 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
11220 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
11230 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
11240 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
11250 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
11260 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11270 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
112a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
112b0 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
112c0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
112d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
112e0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
112f0 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
11300 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
11310 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
11320 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11330 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
11340 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
11350 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
11360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
11370 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11380 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
11390 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
113a0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
113b0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
113c0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
113d0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
113e0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
113f0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
11400 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
11410 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
11420 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
11430 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
11440 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
11450 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
11460 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
11470 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
11480 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
11490 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
114a0 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
114b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
114c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
114d0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
114e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
114f0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11500 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11510 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11520 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
11530 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11540 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11550 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
11560 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
11570 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11580 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  );.  afpLockingC
11590 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
115a0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
115b0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
115c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
115d0 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
115e0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
115f0 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
11600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11610 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
11620 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
11630 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
11640 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
11650 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
11660 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
11670 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
11680 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
11690 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
116a0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
116b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
116c0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
116d0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
116e0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
116f0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
11700 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
11710 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
11720 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
11730 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
11740 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
11750 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
11760 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
11770 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
11780 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
11790 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
117a0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
117b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
117c0 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
117d0 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
117e0 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
117f0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
11800 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
11810 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
11820 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
11830 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
11840 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
11850 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
11860 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
11870 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
11880 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
11890 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
118a0 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
118b0 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
118c0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
118d0 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
118e0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
118f0 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
11900 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
11910 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
11920 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
11930 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
11940 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
11950 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
11960 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
11970 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11990 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
119a0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
119b0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
119c0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
119d0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
119e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
119f0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11a00 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11a10 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
11a20 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11a30 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11a40 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11a50 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11a60 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11a70 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11a80 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11a90 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11aa0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11ab0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11ac0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11ad0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11ae0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11af0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11b00 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11b10 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11b20 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11b30 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11b40 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11b50 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11b60 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11b70 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11b80 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11b90 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11ba0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11bb0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11bc0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11bd0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11be0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11bf0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11c00 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11c10 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11c20 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11c30 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11c40 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
11c50 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11c60 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11c70 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11c80 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11c90 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11ca0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
11cc0 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
11cd0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
11ce0 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
11cf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11d00 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11d10 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11d20 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
11d30 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
11d40 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
11d50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
11d60 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
11d70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
11d80 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
11d90 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
11da0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
11db0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
11dc0 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
11dd0 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
11de0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
11df0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
11e00 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
11e10 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
11e20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
11e30 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
11e40 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
11e50 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
11e60 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
11e70 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
11e80 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
11e90 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
11ea0 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
11eb0 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
11ec0 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
11ed0 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
11ee0 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
11ef0 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
11f00 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
11f10 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
11f20 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
11f30 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
11f40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
11f50 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
11f60 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
11f70 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
11f80 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
11f90 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
11fa0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
11fb0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
11fc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11fd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
11fe0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
11ff0 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
12000 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
12010 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
12020 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
12030 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
12040 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
12050 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
12060 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
12070 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
12080 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
12090 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
120a0 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
120b0 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
120c0 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
120d0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
120e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
120f0 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
12100 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
12110 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
12120 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
12130 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
12140 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
12150 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
12160 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
12170 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
12180 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
12190 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
121a0 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
121b0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
121c0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
121d0 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
121e0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
121f0 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
12200 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
12210 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
12220 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
12230 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
12240 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
12250 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
12260 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
12270 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
12280 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
12290 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
122a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
122b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
122c0 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
122d0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
122e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
122f0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
12300 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
12310 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12320 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
12330 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
12340 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
12350 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
12360 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
12370 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
12380 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
12390 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
123a0 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
123b0 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
123c0 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
123d0 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
123e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
123f0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
12400 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
12410 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
12420 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
12430 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
12440 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
12450 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
12460 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
12470 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12480 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
12490 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
124a0 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
124b0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
124c0 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
124d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
124e0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
124f0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
12500 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
12510 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
12520 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
12530 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
12540 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
12550 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
12560 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
12570 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
12580 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
12590 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
125a0 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
125b0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
125c0 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
125d0 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
125e0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
125f0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
12600 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
12610 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
12620 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
12630 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
12640 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
12650 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
12660 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
12670 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
12680 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
12690 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
126a0 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
126b0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
126c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
126d0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
126e0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
126f0 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
12700 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
12710 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
12720 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
12730 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
12740 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
12750 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
12760 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
12770 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12780 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
12790 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
127a0 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67  1Errno;.    long
127b0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
127c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
127d0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
127e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
127f0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
12800 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
12810 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
12820 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
12830 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
12840 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
12850 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
12860 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
12870 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
12880 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
12890 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
128a0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
128b0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
128c0 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
128d0 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
128e0 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
128f0 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
12900 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
12910 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
12920 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12930 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
12940 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
12950 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
12960 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
12970 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
12980 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
12990 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
129a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
129b0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
129c0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
129d0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
129e0 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
129f0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
12a00 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
12a10 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
12a20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
12a30 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12a40 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70  rc1) ) {.      p
12a50 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12a60 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  = lrc1Errno;.   
12a70 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
12a80 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
12a90 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
12aa0 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52  e if( IS_LOCK_ER
12ab0 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20  ROR(lrc2) ){.   
12ac0 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20     rc = lrc2;.  
12ad0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
12ae0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
12af0 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51  e if( lrc1 != SQ
12b00 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
12b10 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
12b20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
12b30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12b40 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
12b50 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
12b60 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
12b70 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
12b80 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
12b90 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
12ba0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
12bb0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
12bc0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
12bd0 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
12be0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12bf0 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
12c00 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
12c10 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
12c20 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
12c30 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
12c40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
12c50 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
12c60 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
12c70 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
12c80 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
12c90 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
12ca0 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
12cb0 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
12cc0 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
12cd0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
12ce0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
12cf0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
12d00 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a  int failed = 0;.
12d10 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
12d20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12d30 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65  );.    if (eFile
12d40 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44  Lock >= RESERVED
12d50 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
12d60 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45  eFileLock < RESE
12d70 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
12d80 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
12d90 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
12da0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
12db0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
12dc0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
12dd0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
12de0 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
12df0 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b    if( !failed ){
12e00 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
12e10 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a  ->reserved = 1;.
12e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12e30 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
12e40 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58   eFileLock == EX
12e50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
12e60 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
12e70 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
12e80 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
12e90 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
12ea0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
12eb0 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
12ec0 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
12ed0 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
12ee0 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
12ef0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
12f00 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
12f10 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
12f20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
12f30 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74  (failed = afpSet
12f40 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
12f50 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
12f60 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61       pInode->sha
12f90 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
12fa0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
12fb0 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
12fc0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
12fd0 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
12fe0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
12ff0 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
13000 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
13010 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13020 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13030 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
13040 20 0a 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 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
13070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
13080 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
13090 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
130a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
130b0 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
130d0 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e  ARED_FIRST + pIn
130e0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
130f0 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20   1, 1)) ){.     
13100 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65       /* Can't re
13110 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
13120 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69  ared lock.  Sqli
13130 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74  te can't deal, t
13140 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20  his is.         
13150 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49   ** a critical I
13160 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  /O error.       
13170 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13180 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20  rc = ((failed & 
13190 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
131a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f   SQLITE_IOERR) ?
131b0 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20   failed2 : .    
131c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
131d0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
131e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70          goto afp
131f0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20  _end_lock;.     
13200 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
13210 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13220 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d  failed; .      }
13230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
13240 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
13250 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
13260 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  }.  }.  .  if( r
13270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13280 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13290 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
132a0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
132b0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
132c0 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
132d0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
132e0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
132f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13300 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
13310 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
13320 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
13330 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
13340 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
13350 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13360 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
13370 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
13380 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
13390 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
133a0 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
133b0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
133c0 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
133d0 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
133e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
133f0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
13400 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
13410 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
13420 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
13430 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
13440 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
13450 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
13460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
13470 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
13480 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
13490 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
134a0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
134b0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
134c0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
134d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
134e0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
134f0 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   afpUnlock(sqlit
13500 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13510 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
13520 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13530 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
13540 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13550 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
13560 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
13570 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
13580 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
13590 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
135a0 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
135b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
135c0 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30  t skipShared = 0
135d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
135e0 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70  TEST.  int h = p
135f0 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a  File->h;.#endif.
13600 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13610 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13620 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13630 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
13640 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
13650 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
13660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13670 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
13680 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
13690 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
136a0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
136b0 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70  .           getp
136c0 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  id()));..  asser
136d0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
136e0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
136f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
13700 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
13710 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13720 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
13730 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
13740 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
13750 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
13760 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
13770 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
13780 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13790 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
137a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
137b0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
137c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
137d0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
137e0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
137f0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
13800 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
13810 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13820 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
13830 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47   .#ifndef NDEBUG
13840 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
13850 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
13860 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
13870 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
13880 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
13890 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
138a0 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
138b0 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
138c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
138d0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
138e0 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
138f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
13900 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
13910 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
13920 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
13930 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
13940 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
13950 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
13960 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
13970 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
13980 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
13990 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
139a0 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
139b0 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
139c0 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
139d0 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
139e0 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
139f0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
13a00 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
13a10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
13a20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
13a30 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
13a40 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
13a50 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
13a60 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
13a70 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
13a80 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
13a90 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
13aa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
13ab0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13ac0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
13ad0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
13ae0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
13af0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
13b00 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
13b10 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
13b20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
13b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13b40 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
13b50 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
13b60 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
13b70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
13b80 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
13b90 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
13ba0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
13bb0 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
13bc0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
13bd0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
13be0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
13bf0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
13c00 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
13c10 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
13c20 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
13c30 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
13c40 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
13c50 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
13c60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13c70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13c80 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
13c90 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
13ca0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
13cb0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
13cc0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
13cd0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
13ce0 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
13cf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13d00 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
13d10 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
13d20 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
13d30 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
13d40 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
13d50 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
13d60 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
13d70 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
13d80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
13d90 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
13da0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
13db0 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
13dc0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
13dd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
13de0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
13df0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
13e00 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
13e10 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
13e20 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
13e30 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
13e40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13e50 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
13e60 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
13e70 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
13e80 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
13e90 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
13ea0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
13eb0 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
13ec0 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
13ed0 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
13ee0 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
13ef0 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
13f00 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
13f10 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
13f20 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
13f30 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
13f40 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
13f50 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
13f60 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
13f70 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
13f80 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
13f90 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13fa0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
13fb0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13fc0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
13fd0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13fe0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
13ff0 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
14000 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
14010 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
14020 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
14030 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
14040 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
14050 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14060 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
14070 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
14080 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
14090 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
140a0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
140b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
140c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
140d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
140e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
140f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
14100 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
14110 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
14120 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
14130 20 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65        rc = close
14140 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
14150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14160 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
14170 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
14180 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14190 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
141a0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
141b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
141c0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
141d0 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
141e0 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
141f0 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
14200 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
14210 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14220 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
14230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
14240 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
14250 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14260 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
14270 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   afpUnlock(id, N
14280 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69  O_LOCK);.    uni
14290 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
142a0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
142b0 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70  node && pFile->p
142c0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
142d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
142e0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
142f0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
14300 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
14310 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
14320 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
14330 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
14340 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
14350 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
14360 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
14370 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
14380 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
14390 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
143a0 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
143b0 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
143c0 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
143d0 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
143e0 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
143f0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
14400 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e   }.    releaseIn
14410 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70  odeInfo(pFile->p
14420 49 6e 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69  Inode);.    sqli
14430 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
14440 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
14450 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
14460 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
14470 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
14480 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14490 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
144a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
144b0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
144c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
144d0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
144e0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
144f0 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
14500 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
14510 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
14520 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
14530 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
14540 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
14550 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
14560 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
14570 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
14580 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
14590 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
145a0 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
145b0 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
145c0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145e0 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
145f0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
14600 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2f 0a 0a 2f 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 2a 2a 0a 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 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
146e0 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S 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 2a 2a 2f 0a 0a 23 69 66  **********/..#if
14710 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
14720 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
14730 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
14740 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
14750 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
14760 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
14770 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
14780 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
14790 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ock. ** must be 
147a0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
147b0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
147c0 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
147d0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
147e0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
147f0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
14800 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
14810 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
14820 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
14830 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14840 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
14850 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
14860 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14870 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
14880 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e   return _posixUn
14890 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
148a0 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
148b0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
148c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
148d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
148e0 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
148f0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
14900 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
14910 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
14920 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
14930 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
14940 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
14950 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
14960 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
14970 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
14980 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
14990 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
149a0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
149b0 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
149c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 2a 2a 0a 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 2a  ****************
14a30 2a 2f 0a 0a 2f 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 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14a90 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
14aa0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
14ab0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
14ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ad0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
14ae0 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
14af0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
14b00 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
14b10 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
14b20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
14b30 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
14b40 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
14b50 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
14b60 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
14b70 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
14b80 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
14b90 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
14ba0 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
14bb0 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
14bc0 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
14bd0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
14be0 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
14bf0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
14c00 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
14c10 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
14c20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
14c30 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
14c40 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
14c50 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
14c60 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
14c70 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14c80 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
14c90 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
14ca0 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
14cb0 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
14cc0 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
14cd0 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
14ce0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
14cf0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
14d00 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
14d10 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
14d20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
14d30 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
14d40 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
14d50 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
14d60 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e  _PREAD.** any an
14d70 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
14d80 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
14d90 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
14da0 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
14db0 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
14dc0 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
14dd0 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
14de0 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
14df0 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
14e00 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
14e10 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
14e20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
14e30 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
14e40 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
14e50 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
14e60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
14e70 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
14e80 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
14e90 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65  nt got;.#if (!de
14ea0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
14eb0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
14ec0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
14ed0 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
14ee0 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
14ef0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
14f00 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
14f10 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
14f20 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
14f30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
14f40 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
14f50 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
14f60 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f  SE_PREAD64).  go
14f70 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d 3e  t = pread64(id->
14f80 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
14f90 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
14fa0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
14fb0 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  -1 );.#else.  ne
14fc0 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
14fd0 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
14fe0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75  EEK_SET);.  Simu
14ff0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77  lateIOError( new
15000 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66  Offset-- );.  if
15010 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
15020 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  set ){.    if( n
15030 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
15040 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
15050 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
15060 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75  }else{.      ((u
15080 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
15090 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
150a0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
150b0 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d   -1;.  }.  got =
150c0 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75   read(id->h, pBu
150d0 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
150e0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
150f0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
15100 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15110 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
15120 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  no;.  }.  OSTRAC
15130 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
15140 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
15150 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
15160 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
15170 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
15180 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
15190 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
151a0 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
151b0 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
151c0 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
151d0 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
151e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
151f0 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
15200 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
15210 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
15220 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
15230 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
15240 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
15250 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
15260 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
15270 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
15280 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
15290 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
152a0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
152b0 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20  rt( id );..  /* 
152c0 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
152d0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
152e0 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
152f0 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
15300 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
15310 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
15320 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
15330 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
15340 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
15350 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
15360 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
15370 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
15380 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
15390 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
153a0 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
153b0 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
153c0 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
153d0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
153e0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
153f0 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
15400 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
15410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15420 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
15430 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
15440 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
15450 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
15460 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15470 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
15480 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
15490 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
154a0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
154b0 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
154c0 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
154d0 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
154e0 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
154f0 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
15500 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
15510 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
15520 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15530 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
15540 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
15550 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
15560 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
15570 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
15580 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
15590 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
155a0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
155b0 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
155c0 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
155d0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
155e0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
155f0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
15600 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
15610 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
15620 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
15630 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
15640 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
15650 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
15660 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
15670 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
15680 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
15690 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
156a0 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
156b0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
156c0 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
156d0 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
156e0 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
156f0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
15700 44 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  D).  got = pwrit
15710 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
15720 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
15730 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
15740 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
15750 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  pwrite64(id->h, 
15760 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
15770 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
15780 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
15790 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
157a0 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65  K_SET);.  if( ne
157b0 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
157c0 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
157d0 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
157e0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
157f0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
15800 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
15810 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
15820 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
15830 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
15840 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
15850 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69  .  }.  got = wri
15860 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
15870 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
15880 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
15890 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
158a0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
158b0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
158c0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
158d0 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
158e0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
158f0 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
15900 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
15910 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
15920 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  got;.}.../*.** W
15930 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
15940 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
15950 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
15960 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
15970 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
15980 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
15990 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
159a0 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
159b0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
159c0 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  e *id, .  const 
159d0 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
159e0 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
159f0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a  3_int64 offset .
15a00 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
15a10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15a20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74  *)id;.  int wrot
15a30 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
15a40 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28   id );.  assert(
15a50 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20   amt>0 );..  /* 
15a60 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
15a70 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
15a80 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
15a90 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
15aa0 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
15ab0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
15ac0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
15ad0 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
15ae0 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
15af0 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
15b00 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
15b10 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
15b20 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
15b30 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
15b40 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
15b50 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
15b60 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
15b70 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
15b80 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
15b90 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
15ba0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
15bb0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
15bc0 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
15bd0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
15be0 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
15bf0 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
15c00 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
15c10 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
15c20 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
15c30 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
15c40 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
15c50 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
15c60 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
15c70 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
15c80 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
15c90 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
15ca0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
15cb0 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
15cc0 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
15cd0 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
15ce0 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
15cf0 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
15d00 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
15d10 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
15d20 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
15d30 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
15d40 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
15d50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
15d60 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
15d70 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
15d80 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
15d90 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
15da0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
15db0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
15dc0 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
15dd0 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
15de0 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
15df0 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
15e00 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
15e10 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
15e20 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
15e30 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
15e40 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
15e50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
15e60 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
15e70 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
15e80 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
15e90 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
15ea0 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
15eb0 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
15ec0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
15ed0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
15ee0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
15ef0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
15f00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
15f10 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
15f20 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
15f30 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
15f40 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
15f50 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  );.  if( amt>0 )
15f60 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
15f70 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  0 ){.      /* la
15f80 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
15f90 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
15fa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15fb0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
15fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15fd0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15fe0 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
15ff0 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
16000 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16010 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
16020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
16030 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
16040 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
16050 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
16060 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
16070 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
16080 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
16090 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
160a0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
160b0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
160c0 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
160d0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
160e0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
160f0 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
16100 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
16110 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16120 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
16130 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
16140 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
16150 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
16160 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
16170 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
16180 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
16190 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
161a0 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a  lower) fsync()..
161b0 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ** If you know t
161c0 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
161d0 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
161e0 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
161f0 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
16200 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
16210 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
16220 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
16230 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
16240 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c   && !defined(__l
16250 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
16260 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
16270 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
16280 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
16290 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
162a0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
162b0 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
162c0 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
162d0 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
162e0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
162f0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
16300 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
16310 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
16320 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
16330 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
16340 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
16350 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
16360 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16370 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
16380 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
16390 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
163a0 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
163b0 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
163c0 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
163d0 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
163e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
163f0 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
16400 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
16410 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
16420 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
16430 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
16440 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
16450 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
16460 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
16470 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
16480 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
16490 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
164a0 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
164b0 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
164c0 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
164d0 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
164e0 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
164f0 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
16500 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
16510 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
16520 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
16530 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
16540 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
16550 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
16560 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
16570 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74  ite sets the dat
16580 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68  aOnly flag if th
16590 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
165a0 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  le is unchanged.
165b0 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68  .** The idea beh
165c0 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20  ind dataOnly is 
165d0 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f  that it should o
165e0 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69  nly write the fi
165f0 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f  le content.** to
16600 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69   disk, not the i
16610 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73  node.  We only s
16620 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74  et dataOnly if t
16630 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
16640 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69  .** unchanged si
16650 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  nce the file siz
16660 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
16670 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72   inode.  However
16680 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74  , .** Ted Ts'o t
16690 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61  ells us that fda
166a0 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c  tasync() will al
166b0 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f  so write the ino
166c0 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c  de if the.** fil
166d0 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67  e size has chang
166e0 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ed.  The only re
166f0 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  al difference be
16700 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28  tween fdatasync(
16710 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29  ).** and fsync()
16720 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20  , Ted tells us, 
16730 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  is that fdatasyn
16740 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75  c() will not flu
16750 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20  sh the.** inode 
16760 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20  if the mtime or 
16770 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69  owner or other i
16780 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20  node attributes 
16790 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  have changed..**
167a0 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   We only care ab
167b0 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  out the file siz
167c0 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72  e, not the other
167d0 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73   file attributes
167e0 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61  , so.** as far a
167f0 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63  s SQLite is conc
16800 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73  erned, an fdatas
16810 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20  ync() is always 
16820 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c  adequate..** So,
16830 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
16840 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74  datasync() if it
16850 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
16860 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20  egardless of.** 
16870 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
16880 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a   dataOnly flag..
16890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
168a0 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
168b0 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
168c0 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
168d0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
168e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64  e following "ifd
168f0 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62  ef/elif/else/" b
16900 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d  lock has the sam
16910 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20  e structure as. 
16920 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f   ** the one belo
16930 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61  w. It is replica
16940 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20  ted here solely 
16950 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72  to avoid clutter
16960 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ing .  ** up the
16970 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20   real code with 
16980 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  the UNUSED_PARAM
16990 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20  ETER() macros.. 
169a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
169b0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53  E_NO_SYNC.  UNUS
169c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
169d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
169e0 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
169f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16a00 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
16a10 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
16a20 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
16a30 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
16a40 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
16a50 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
16a60 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
16a70 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
16a80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
16a90 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
16aa0 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
16ab0 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
16ac0 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
16ad0 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
16ae0 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
16af0 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
16b00 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
16b10 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
16b20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
16b30 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
16b40 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
16b50 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
16b60 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
16b70 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
16b80 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
16b90 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
16ba0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
16bb0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
16bc0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
16bd0 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
16be0 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
16bf0 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
16c00 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
16c10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
16c20 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
16c30 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
16c40 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
16c50 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  = fcntl(fd, F_FU
16c60 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
16c70 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
16c80 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
16c90 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
16ca0 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
16cb0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
16cc0 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
16cd0 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
16ce0 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
16cf0 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
16d00 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
16d10 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
16d20 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
16d30 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
16d40 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
16d50 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
16d60 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
16d70 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
16d80 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
16d90 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
16da0 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
16db0 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
16dc0 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
16dd0 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
16de0 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
16df0 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
16e00 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
16e10 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
16e20 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
16e30 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
16e40 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
16e50 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
16e60 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
16e70 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
16e80 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
16e90 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
16ea0 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
16eb0 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
16ec0 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
16ed0 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
16ee0 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
16ef0 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
16f00 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
16f10 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
16f20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
16f30 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
16f40 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
16f50 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
16f60 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
16f70 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
16f80 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
16f90 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
16fa0 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
16fb0 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
16fc0 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
16fd0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
16fe0 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
16ff0 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
17000 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
17010 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17020 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
17030 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
17040 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
17050 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
17060 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
17070 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
17080 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
17090 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
170a0 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
170b0 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
170c0 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
170d0 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
170e0 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
170f0 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
17100 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
17110 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
17120 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17130 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
17140 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
17150 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
17160 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
17170 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
17180 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
17190 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
171a0 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
171b0 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
171c0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
171d0 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
171e0 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
171f0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
17200 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
17210 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
17220 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
17230 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
17240 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
17250 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
17260 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
17270 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
17280 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
17290 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
172a0 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
172b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
172c0 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
172d0 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
172e0 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
172f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
17300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
17310 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
17320 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
17330 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
17340 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17350 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17360 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
17370 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
17380 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
17390 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
173a0 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
173b0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
173c0 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
173d0 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
173e0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
173f0 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
17400 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
17410 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
17420 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
17430 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
17440 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
17450 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
17460 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
17470 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
17480 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
17490 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
174a0 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
174b0 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
174c0 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
174d0 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
174e0 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
174f0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
17500 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
17510 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
17520 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
17530 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
17540 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
17550 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
17560 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
17570 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
17580 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
17590 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
175a0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
175b0 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
175c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
175d0 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
175e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
175f0 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  NC;.  }.  if( pF
17600 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
17610 0a 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  .    int err;.  
17620 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
17630 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66  YNC %-3d (have_f
17640 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
17650 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
17660 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20  le->dirfd,.     
17670 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
17680 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e  FSYNC, isFullsyn
17690 63 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c));.#ifndef SQL
176a0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
176b0 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  YNC.    /* The d
176c0 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
176d0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
176e0 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73  if full_fsync is
176f0 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f  .    ** turned o
17700 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c  ff or unavailabl
17710 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73  e.  If a full_fs
17720 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ync occurred abo
17730 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ve,.    ** then 
17740 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  the directory sy
17750 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  nc is superfluou
17760 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
17770 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59  ( (!HAVE_FULLFSY
17780 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e  NC || !isFullsyn
17790 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63  c) && full_fsync
177a0 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c  (pFile->dirfd,0,
177b0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a  0) ){.       /*.
177c0 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76         ** We hav
177d0 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
177e0 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66  ple reports of f
177f0 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67  sync() returning
17800 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  .       ** error
17810 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74  s when applied t
17820 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e  o directories on
17830 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79   certain file sy
17840 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a  stems..       **
17850 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74   A failed direct
17860 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20  ory sync is not 
17870 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20  a big deal.  So 
17880 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20  it seems.       
17890 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e  ** better to ign
178a0 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20  ore the error.  
178b0 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20  Ticket #1657.   
178c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a      */.       /*
178d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
178e0 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20  o = errno; */.  
178f0 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53       /* return S
17900 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a  QLITE_IOERR; */.
17910 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
17920 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69   err = close(pFi
17930 6c 65 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f  le->dirfd); /* O
17940 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
17950 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
17960 74 68 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  the */.    if( e
17970 72 72 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  rr==0 ){        
17980 20 20 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f        /* directo
17990 72 79 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  ry when we are d
179a0 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  one */.      pFi
179b0 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
179c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
179d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
179e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
179f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
17a00 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
17a10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17a20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
17a30 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
17a40 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
17a50 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
17a60 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
17a70 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
17a80 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
17a90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
17aa0 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d  ert( id );.  Sim
17ab0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
17ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17ad0 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20  R_TRUNCATE );.  
17ae0 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28  rc = ftruncate((
17af0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
17b00 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29  h, (off_t)nByte)
17b10 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
17b20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17b30 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
17b40 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
17b50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
17b60 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  UNCATE;.  }else{
17b70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17b80 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
17b90 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
17ba0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
17bb0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
17bc0 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64  osed to.    ** d
17bd0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
17be0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
17bf0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
17c00 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
17c10 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64  .    ** normal d
17c20 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e  atabase file) an
17c30 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68  d we truncate th
17c40 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
17c50 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68  ength,.    ** th
17c60 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75  at effectively u
17c70 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
17c80 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  e counter.  This
17c90 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20   might happen.  
17ca0 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72    ** when restor
17cb0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75  ing a database u
17cc0 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
17cd0 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  API from a zero-
17ce0 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f  length.    ** so
17cf0 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  urce..    */.   
17d00 20 69 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a   if( ((unixFile*
17d10 29 69 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  )id)->inNormalWr
17d20 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20  ite && nByte==0 
17d30 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
17d40 69 6c 65 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43  ile*)id)->transC
17d50 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
17d60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
17d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17d80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
17d90 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
17da0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
17db0 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
17dc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
17dd0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
17de0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
17df0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
17e00 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
17e10 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
17e20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  );.  rc = fstat(
17e30 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
17e40 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
17e50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
17e60 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
17e70 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
17e80 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
17e90 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
17ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17eb0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
17ec0 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
17ed0 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68  t_size;..  /* Wh
17ee0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72  en opening a zer
17ef0 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c  o-size database,
17f00 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e   the findInodeIn
17f10 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20  fo() procedure. 
17f20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e   ** writes a sin
17f30 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68  gle byte into th
17f40 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  at file in order
17f50 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
17f60 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68  a bug.  ** in th
17f70 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c  e OS-X msdos fil
17f80 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64  esystem.  In ord
17f90 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
17fa0 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a  lems with upper.
17fb0 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20    ** layers, we 
17fc0 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  need to report t
17fd0 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73  his file size as
17fe0 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67   zero even thoug
17ff0 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61  h it is.  ** rea
18000 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20  lly 1.   Ticket 
18010 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3260..  */.  if
18020 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70  ( *pSize==1 ) *p
18030 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65  Size = 0;...  re
18040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18050 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
18060 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18070 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
18080 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48  APPLE__)./*.** H
18090 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79  andler for proxy
180a0 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f  -locking file-co
180b0 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65  ntrol verbs.  De
180c0 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74  fined below in t
180d0 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c  he.** proxying l
180e0 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e  ocking division.
180f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18100 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
18110 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
18120 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66  t,void*);.#endif
18130 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  .../*.** Informa
18140 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  tion and control
18150 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65   of an open file
18160 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
18170 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43  ic int unixFileC
18180 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
18190 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
181a0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
181b0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
181c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
181d0 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
181e0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
181f0 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a  rg = ((unixFile*
18200 29 69 64 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  )id)->eFileLock;
18210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18230 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
18240 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
18250 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
18260 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18270 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
18280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18290 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
182a0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
182b0 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 23 69  _SIZE_HINT: {.#i
182c0 66 20 30 20 2f 2a 20 4e 6f 20 70 65 72 66 6f 72  f 0 /* No perfor
182d0 6d 61 6e 63 65 20 61 64 76 61 6e 74 61 67 65 20  mance advantage 
182e0 73 65 65 6e 20 6f 6e 20 4c 69 6e 75 78 20 2a 2f  seen on Linux */
182f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
18300 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 2a 28  nt64 szFile = *(
18310 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
18320 41 72 67 3b 0a 20 20 20 20 20 20 75 6e 69 78 46  Arg;.      unixF
18330 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
18340 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
18350 20 20 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c    ftruncate(pFil
18360 65 2d 3e 68 2c 20 73 7a 46 69 6c 65 29 3b 0a 23  e->h, szFile);.#
18370 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
18380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18390 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
183a0 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
183b0 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
183c0 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
183d0 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
183e0 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
183f0 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
18400 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
18410 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
18420 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
18430 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
18440 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18450 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
18460 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
18470 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
18480 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18490 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
184a0 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
184b0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
184c0 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
184d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
184e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
184f0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
18500 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
18510 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
18520 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
18530 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
18540 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
18550 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
18560 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
18570 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
18580 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
18590 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
185a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
185b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
185c0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
185d0 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
185e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
185f0 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
18600 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
18610 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
18620 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
18630 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
18640 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
18650 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
18660 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
18670 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
18680 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
18690 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
186a0 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
186b0 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
186c0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
186d0 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
186e0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
186f0 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
18700 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
18710 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
18720 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
18730 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
18740 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
18750 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
18760 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
18770 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
18780 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
18790 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
187a0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
187b0 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
187c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
187d0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
187e0 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
187f0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
18800 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18810 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
18820 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
18830 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
18840 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69  always 0 for uni
18850 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
18860 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
18870 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
18880 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
18890 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
188a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
188b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
188c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
188d0 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  IT_WAL.../*.** O
188e0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
188f0 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
18900 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
18910 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
18920 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
18930 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
18940 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
18950 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
18960 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
18970 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
18980 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
18990 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
189a0 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
189b0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
189c0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
189d0 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
189e0 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
189f0 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
18a00 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
18a10 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
18a20 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
18a30 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
18a40 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
18a50 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
18a60 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
18a70 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
18a80 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
18a90 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
18aa0 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
18ab0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
18ac0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
18ad0 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
18ae0 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
18af0 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
18b00 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
18b10 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
18b20 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
18b30 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
18b40 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
18b50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18b60 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
18b70 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
18b80 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
18b90 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
18ba0 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
18bb0 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
18bc0 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
18bd0 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
18be0 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
18bf0 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
18c00 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
18c10 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
18c20 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
18c30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
18c40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
18c50 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
18c60 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
18c70 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
18c80 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
18c90 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
18ca0 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
18cb0 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
18cc0 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
18cd0 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
18ce0 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
18cf0 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
18d00 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
18d10 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
18d20 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
18d30 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
18d40 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
18d50 6f 20 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b  o avoid deadlock
18d60 73 2c 20 6d 75 74 65 78 20 61 6e 64 20 6d 75 74  s, mutex and mut
18d70 65 78 42 75 66 20 61 72 65 20 61 6c 77 61 79 73  exBuf are always
18d80 20 72 65 6c 65 61 73 65 64 20 69 6e 20 74 68 65   released in the
18d90 0a 2a 2a 20 72 65 76 65 72 73 65 20 6f 72 64 65  .** reverse orde
18da0 72 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  r that they are 
18db0 61 63 71 75 69 72 65 64 2e 20 20 6d 75 74 65 78  acquired.  mutex
18dc0 42 75 66 20 69 73 20 61 6c 77 61 79 73 20 61 63  Buf is always ac
18dd0 71 75 69 72 65 64 0a 2a 2a 20 66 69 72 73 74 20  quired.** first 
18de0 61 6e 64 20 72 65 6c 65 61 73 65 64 20 6c 61 73  and released las
18df0 74 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69 61  t.  This invaria
18e00 6e 74 20 69 73 20 63 68 65 63 6b 20 62 79 20 61  nt is check by a
18e10 73 73 65 72 74 69 6e 67 0a 2a 2a 20 73 71 6c 69  sserting.** sqli
18e20 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
18e30 64 28 29 20 6f 6e 20 6d 75 74 65 78 20 77 68 65  d() on mutex whe
18e40 6e 65 76 65 72 20 6d 75 74 65 78 42 75 66 20 69  never mutexBuf i
18e50 73 20 61 63 71 75 69 72 65 64 20 6f 72 0a 2a 2a  s acquired or.**
18e60 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74   released..*/.st
18e70 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
18e80 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e   {.  unixInodeIn
18e90 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
18ea0 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  /* unixInodeInfo
18eb0 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
18ec0 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  SHM node */.  sq
18ed0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
18ee0 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
18ef0 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
18f00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
18f10 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
18f20 78 42 75 66 3b 20 20 20 2f 2a 20 4d 75 74 65 78  xBuf;   /* Mutex
18f30 20 74 6f 20 61 63 63 65 73 73 20 7a 42 75 66 5b   to access zBuf[
18f40 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  ] */.  char *zFi
18f50 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
18f60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18f70 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
18f80 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18fa0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
18fb0 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
18fc0 7a 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  zMap;           
18fd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18fe0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 6e 74   the mapping int
18ff0 6f 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68  o memory */.  ch
19000 61 72 20 2a 70 4d 4d 61 70 42 75 66 3b 20 20 20  ar *pMMapBuf;   
19010 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
19020 65 20 63 75 72 72 65 6e 74 6c 79 20 6d 6d 61 70  e currently mmap
19030 70 65 64 28 29 2e 20 20 4e 55 4c 4c 20 69 66 20  ped().  NULL if 
19040 75 6e 6d 61 70 70 65 64 20 2a 2f 0a 20 20 69 6e  unmapped */.  in
19050 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
19060 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19070 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62  er of unixShm ob
19080 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
19090 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78  o this */.  unix
190a0 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
190b0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e         /* All un
190c0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
190d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
190e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
190f0 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d  DEBUG.  u8 exclM
19100 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
19110 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
19120 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
19130 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65  ld */.  u8 share
19140 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
19150 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
19160 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
19170 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  */.  u8 nextShmI
19180 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
19190 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
191a0 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c  e unixShm.id val
191b0 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
191c0 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
191d0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
191e0 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
191f0 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
19200 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
19210 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
19220 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
19230 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
19240 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
19250 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
19260 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
19270 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
19280 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
19290 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  .**.**    unixSh
192a0 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e  m.pFile.**    un
192b0 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  ixShm.id.**.** A
192c0 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
192d0 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
192e0 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69   The unixShm.pFi
192f0 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
19300 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
19310 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
19320 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
19330 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
19340 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  hm {.  unixShmNo
19350 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
19360 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
19370 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ing unixShmNode 
19380 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78  object */.  unix
19390 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
193a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75         /* Next u
193b0 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20  nixShm with the 
193c0 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65  same unixShmNode
193d0 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
193e0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
193f0 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
19400 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  ing the unixShmN
19410 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
19420 38 20 68 61 73 4d 75 74 65 78 42 75 66 3b 20 20  8 hasMutexBuf;  
19430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19440 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 70 46 69  e if holding pFi
19450 6c 65 2d 3e 6d 75 74 65 78 42 75 66 20 2a 2f 0a  le->mutexBuf */.
19460 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
19470 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19480 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
19490 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
194a0 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
194b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
194c0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
194d0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
194e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
194f0 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19510 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
19520 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
19530 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
19540 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
19550 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
19560 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
19570 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
19580 5f 42 41 53 45 20 20 20 28 28 31 38 2b 53 51 4c  _BASE   ((18+SQL
19590 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
195a0 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  )         /* fir
195b0 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
195c0 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
195d0 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48  _DMS    (UNIX_SH
195e0 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
195f0 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
19600 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
19610 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69  /*.** Apply posi
19620 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x advisory locks
19630 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66   for all bytes f
19640 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68  rom ofst through
19650 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a   ofst+n-1..**.**
19660 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20   Locks block if 
19670 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63  the mask is exac
19680 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61  tly UNIX_SHM_C a
19690 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b  nd are non-block
196a0 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ing.** otherwise
196b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
196c0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
196d0 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  k(.  unixShmNode
196e0 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41   *pShmNode, /* A
196f0 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
19700 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
19710 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
19720 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
19730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55            /* F_U
19740 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  NLCK, F_RDLCK, o
19750 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  r F_WRLCK */.  i
19760 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
19770 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
19780 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  yte of the locki
19790 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  ng range */.  in
197a0 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  t n             
197b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
197c0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
197d0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
197e0 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a  lock f;       /*
197f0 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   The posix advis
19800 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ory locking stru
19810 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72  cture */.  int r
19820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
19830 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
19840 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
19850 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
19860 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
19870 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
19880 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
19890 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
198a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
198b0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
198c0 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
198d0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
198e0 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
198f0 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
19900 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
19910 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
19920 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
19930 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
19940 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
19950 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
19960 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54   n>=1 && n<SQLIT
19970 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a  E_SHM_NLOCK );..
19980 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19990 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
199a0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73  meters */.  mems
199b0 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
199c0 28 66 29 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65  (f));.  f.l_type
199d0 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66   = lockType;.  f
199e0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
199f0 5f 53 45 54 3b 0a 20 20 66 2e 6c 5f 73 74 61 72  _SET;.  f.l_star
19a00 74 20 3d 20 6f 66 73 74 3b 0a 20 20 66 2e 6c 5f  t = ofst;.  f.l_
19a10 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 72 63 20 3d  len = n;..  rc =
19a20 20 66 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d   fcntl(pShmNode-
19a30 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
19a40 3b 0a 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d  ;.  rc = (rc!=(-
19a50 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
19a60 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a  : SQLITE_BUSY;..
19a70 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
19a80 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
19a90 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
19aa0 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
19ab0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
19ac0 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
19ad0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
19ae0 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28   "));.  mask = (
19af0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
19b00 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
19b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19b20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
19b30 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
19b40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
19b50 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
19b60 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
19b70 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
19b80 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
19b90 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
19ba0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
19bb0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
19bc0 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
19bd0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
19be0 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
19bf0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
19c00 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
19c10 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
19c20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
19c30 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
19c40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19c50 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
19c60 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
19c70 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
19c80 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
19c90 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
19ca0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
19cb0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
19cc0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
19cd0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
19ce0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19cf0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
19d00 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
19d10 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
19d20 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
19d30 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
19d40 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
19d50 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
19d60 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
19d70 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
19d80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d90 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
19da0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
19db0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
19dc0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
19dd0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
19de0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
19df0 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
19e00 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
19e10 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
19e20 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
19e30 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
19e40 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
19e50 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
19e60 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a        .}.../*.**
19e70 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53   Purge the unixS
19e80 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
19e90 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
19ea0 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  ith unixShmNode.
19eb0 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
19ec0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
19ed0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
19ee0 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
19ef0 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
19f00 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
19f10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
19f20 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
19f30 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75  c void unixShmPu
19f40 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rge(unixFile *pF
19f50 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  d){.  unixShmNod
19f60 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f  e *p = pFd->pIno
19f70 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
19f80 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
19f90 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
19fa0 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30   p && p->nRef==0
19fb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19fc0 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
19fd0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69 66  pInode );.    if
19fe0 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c  ( p->mutex ) sql
19ff0 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
1a000 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 69  p->mutex);.    i
1a010 66 28 20 70 2d 3e 6d 75 74 65 78 42 75 66 20 29  f( p->mutexBuf )
1a020 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
1a030 72 65 65 28 70 2d 3e 6d 75 74 65 78 42 75 66 29  ree(p->mutexBuf)
1a040 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4d 4d  ;.    if( p->pMM
1a050 61 70 42 75 66 20 29 20 6d 75 6e 6d 61 70 28 70  apBuf ) munmap(p
1a060 2d 3e 70 4d 4d 61 70 42 75 66 2c 20 70 2d 3e 73  ->pMMapBuf, p->s
1a070 7a 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 70  zMap);.    if( p
1a080 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70  ->h>=0 ) close(p
1a090 2d 3e 68 29 3b 0a 20 20 20 20 70 2d 3e 70 49 6e  ->h);.    p->pIn
1a0a0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1a0b0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
1a0c0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
1a0d0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1a0e0 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  nce */.static co
1a0f0 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
1a100 6d 70 46 69 6c 65 44 69 72 28 69 6e 74 29 3b 0a  mpFileDir(int);.
1a110 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
1a120 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1a130 2e 20 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  .  This particul
1a140 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
1a150 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70 70 65  n uses.** mmappe
1a160 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 7a  d files..**.** z
1a170 4e 61 6d 65 20 69 73 20 61 20 66 69 6c 65 6e 61  Name is a filena
1a180 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74  me used to ident
1a190 69 66 79 20 74 68 65 20 73 68 61 72 65 64 2d 6d  ify the shared-m
1a1a0 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68 65  emory area.  The
1a1b0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1a1c0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e 64  on does not (and
1a1d0 20 70 65 72 68 61 70 73 20 73 68 6f 75 6c 64 20   perhaps should 
1a1e0 6e 6f 74 29 20 75 73 65 20 74 68 69 73 20 6e 61  not) use this na
1a1f0 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c 20  me.** directly, 
1a200 62 75 74 20 72 61 74 68 65 72 20 75 73 65 20 69  but rather use i
1a210 74 20 61 73 20 61 20 74 65 6d 70 6c 61 74 65 20  t as a template 
1a220 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e 20 61  for finding an a
1a230 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6e 61  ppropriate.** na
1a240 6d 65 20 66 6f 72 20 74 68 65 20 73 68 61 72 65  me for the share
1a250 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61 67 65  d-memory storage
1a260 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65  .  In this imple
1a270 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a  mentation, the.*
1a280 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e 64 65 78  * string "-index
1a290 22 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  " is appended to
1a2a0 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65 64 20   zName and used 
1a2b0 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  as the name of t
1a2c0 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66 69  he.** mmapped fi
1a2d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  le..**.** When o
1a2e0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1a2f0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1a300 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1a310 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1a320 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1a330 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1a340 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1a350 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1a360 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1a370 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1a380 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1a390 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1a3a0 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1a3b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a3c0 69 78 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71 6c  ixShmOpen(.  sql
1a3d0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
1a3e0 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
1a3f0 65 73 63 72 69 70 74 6f 72 20 6f 66 20 74 68 65  escriptor of the
1a400 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
1a410 62 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  base */.){.  str
1a420 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
1a430 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a440 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1a450 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
1a460 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  /.  struct unixS
1a470 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1a480 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 75 6e   = 0;  /* The un
1a490 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
1a4a0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
1a4b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4d0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1a4e0 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
1a4f0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
1a500 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69       /* Underlyi
1a510 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1a520 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
1a530 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1a540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a550 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20  inode of fd */. 
1a560 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
1a570 6d 70 44 69 72 3b 20 20 20 20 20 20 20 20 20 20  mpDir;          
1a580 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
1a590 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1a5a0 69 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  iles */.  int nT
1a5b0 65 6d 70 44 69 72 3b 20 20 20 20 20 20 20 20 20  empDir;         
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a5d0 53 69 7a 65 20 6f 66 20 74 68 65 20 7a 54 65 6d  Size of the zTem
1a5e0 70 44 69 72 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  pDir string */..
1a5f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1a600 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
1a610 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65  sqlite3_shm obje
1a620 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ct..  */.  p = s
1a630 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1a640 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
1a650 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1a660 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a670 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
1a680 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 44 62  zeof(*p));.  pDb
1a690 46 64 20 3d 20 28 73 74 72 75 63 74 20 75 6e 69  Fd = (struct uni
1a6a0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 61 73 73  xFile*)fd;.  ass
1a6b0 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
1a6c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
1a6d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75  ck to see if a u
1a6e0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1a6f0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
1a700 2e 20 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  .  Reuse an exis
1a710 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
1a720 20 70 72 65 73 65 6e 74 2e 20 20 43 72 65 61 74   present.  Creat
1a730 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
1a740 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
1a750 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1a760 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44  );.  pInode = pD
1a770 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70  bFd->pInode;.  p
1a780 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ShmNode = pInode
1a790 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66  ->pShmNode;.  if
1a7a0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
1a7b0 0a 20 20 20 20 7a 54 65 6d 70 44 69 72 20 3d 20  .    zTempDir = 
1a7c0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
1a7d0 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d  1);.    if( zTem
1a7e0 70 44 69 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDir==0 ){.     
1a7f0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1a800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a810 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
1a820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1a830 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52  NTOPEN_NOTEMPDIR
1a840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 54 65 6d  ;.    }.    nTem
1a850 70 44 69 72 20 3d 20 73 74 72 6c 65 6e 28 7a 54  pDir = strlen(zT
1a860 65 6d 70 44 69 72 29 3b 0a 20 20 20 20 70 53 68  empDir);.    pSh
1a870 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  mNode = sqlite3_
1a880 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
1a890 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 54 65 6d  pShmNode) + nTem
1a8a0 70 44 69 72 20 2b 20 35 30 20 29 3b 0a 20 20 20  pDir + 50 );.   
1a8b0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
1a8c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1a8d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a8e0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1a8f0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
1a900 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c  memset(pShmNode,
1a910 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d   0, sizeof(*pShm
1a920 4e 6f 64 65 29 29 3b 0a 20 20 20 20 70 53 68 6d  Node));.    pShm
1a930 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
1a940 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
1a950 64 65 5b 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74  de[1];.    sqlit
1a960 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
1a970 70 44 69 72 2b 35 30 2c 20 70 53 68 6d 4e 6f 64  pDir+50, pShmNod
1a980 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  e->zFilename,.  
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9a0 20 20 20 22 25 73 2f 73 71 6c 69 74 65 2d 77 69     "%s/sqlite-wi
1a9b0 2d 25 78 2d 25 78 22 2c 20 7a 54 65 6d 70 44 69  -%x-%x", zTempDi
1a9c0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1a9d0 20 20 20 20 20 20 20 20 28 75 33 32 29 70 49 6e          (u32)pIn
1a9e0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 2c  ode->fileId.dev,
1a9f0 20 28 75 33 32 29 70 49 6e 6f 64 65 2d 3e 66 69   (u32)pInode->fi
1aa00 6c 65 49 64 2e 69 6e 6f 29 3b 0a 20 20 20 20 70  leId.ino);.    p
1aa10 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b  ShmNode->h = -1;
1aa20 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f  .    pDbFd->pIno
1aa30 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de->pShmNode = p
1aa40 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68  ShmNode;.    pSh
1aa50 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20  mNode->pInode = 
1aa60 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
1aa70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
1aa80 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
1aa90 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1aaa0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
1aab0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
1aac0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
1aad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1aae0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1aaf0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1ab00 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
1ab10 3e 6d 75 74 65 78 42 75 66 20 3d 20 73 71 6c 69  >mutexBuf = sqli
1ab20 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1ab30 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
1ab40 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
1ab50 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 3d 3d  Node->mutexBuf==
1ab60 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1ab70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ab80 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1ab90 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1aba0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
1abb0 6f 70 65 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  open(pShmNode->z
1abc0 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52  Filename, O_RDWR
1abd0 7c 4f 5f 43 52 45 41 54 2c 20 30 36 36 34 29 3b  |O_CREAT, 0664);
1abe0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
1abf0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
1ac00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
1ac10 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
1ac20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1ac30 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rr;.    }..    /
1ac40 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ac50 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
1ac60 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
1ac70 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
1ac80 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  ..    ** If not,
1ac90 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1aca0 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1acb0 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  h. .    */.    r
1acc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1acd0 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79     if( unixShmSy
1ace0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1acf0 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58  e, F_WRLCK, UNIX
1ad00 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
1ad10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ad20 20 69 66 28 20 66 74 72 75 6e 63 61 74 65 28 70   if( ftruncate(p
1ad30 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29  ShmNode->h, 0) )
1ad40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ad50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
1ad60 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  PEN;.      }.   
1ad70 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1ad80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ad90 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
1ada0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1adb0 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  e, F_RDLCK, UNIX
1adc0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1add0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
1ade0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1adf0 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rr;.  }..  /* Ma
1ae00 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
1ae10 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
1ae20 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1ae30 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1ae40 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1ae50 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1ae60 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 23 69 66  ode->pFirst;.#if
1ae70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ae80 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1ae90 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1aea0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1aeb0 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1aec0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1aed0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1aee0 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
1aef0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
1af00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1af10 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1af20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
1af30 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
1af40 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
1af50 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
1af60 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
1af70 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
1af80 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1af90 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
1afa0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
1afb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1afc0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
1afd0 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
1afe0 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
1aff0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
1b000 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
1b010 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
1b020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b030 75 6e 69 78 53 68 6d 43 6c 6f 73 65 28 0a 20 20  unixShmClose(.  
1b040 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1b050 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1b060 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1b070 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1b080 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
1b090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1b0a0 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
1b0b0 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
1b0c0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
1b0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b0e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1b0f0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
1b100 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1b110 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
1b120 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1b130 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
1b140 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
1b150 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1b160 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1b170 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1b180 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1b190 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Fd;       /* The
1b1a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
1b1b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1b1c0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
1b1d0 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
1b1e0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
1b1f0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1b200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
1b210 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1b220 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
1b230 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
1b240 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
1b250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
1b260 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
1b270 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
1b280 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
1b290 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
1b2a0 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
1b2b0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
1b2c0 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
1b2d0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
1b2e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1b2f0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1b300 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
1b310 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
1b320 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
1b330 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
1b340 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
1b350 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
1b360 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 61 73  ection p */.  as
1b370 73 65 72 74 28 20 70 2d 3e 68 61 73 4d 75 74 65  sert( p->hasMute
1b380 78 42 75 66 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  xBuf==0 );.  sql
1b390 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1b3a0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
1b3b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b3c0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1b3d0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
1b3e0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
1b3f0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
1b400 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
1b410 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
1b420 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1b430 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78  e, too */.  unix
1b440 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1b450 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1b460 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
1b470 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
1b480 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1b490 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
1b4a0 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 20  f( deleteFlag ) 
1b4b0 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  unlink(pShmNode-
1b4c0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
1b4d0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
1b4e0 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
1b4f0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1b500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b510 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
1b520 67 65 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ges the size of 
1b530 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  the underlying s
1b540 74 6f 72 61 67 65 20 66 6f 72 20 20 61 20 73 68  torage for  a sh
1b550 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1b560 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ent..**.** The r
1b570 65 71 53 69 7a 65 20 70 61 72 61 6d 65 74 65 72  eqSize parameter
1b580 20 69 73 20 74 68 65 20 6e 65 77 20 72 65 71 75   is the new requ
1b590 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68  ested size of th
1b5a0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  e shared memory.
1b5b0 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  .** This impleme
1b5c0 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
1b5d0 74 6f 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  to increase the 
1b5e0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 69  shared memory si
1b5f0 7a 65 20 74 6f 0a 2a 2a 20 61 6e 79 20 61 6d 6f  ze to.** any amo
1b600 75 6e 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  unt greater than
1b610 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 72 65 71   or equal to req
1b620 53 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 68  Size.  If the sh
1b630 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 0a 2a  ared memory is.*
1b640 2a 20 61 6c 72 65 61 64 79 20 61 73 20 62 69 67  * already as big
1b650 20 6f 72 20 62 69 67 67 65 72 20 61 73 20 72 65   or bigger as re
1b660 71 53 69 7a 65 2c 20 74 68 69 73 20 72 6f 75 74  qSize, this rout
1b670 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1b680 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 71 53 69 7a  **.** The reqSiz
1b690 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  e parameter is t
1b6a0 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
1b6b0 72 65 71 75 65 73 74 65 64 2e 20 20 54 68 65 20  requested.  The 
1b6c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
1b6d0 2a 20 69 73 20 66 72 65 65 20 74 6f 20 65 78 70  * is free to exp
1b6e0 61 6e 64 20 74 68 65 20 73 74 6f 72 61 67 65 20  and the storage 
1b6f0 74 6f 20 73 6f 6d 65 20 6c 61 72 67 65 72 20 61  to some larger a
1b700 6d 6f 75 6e 74 20 69 66 20 69 74 20 63 68 6f 6f  mount if it choo
1b710 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ses..*/.static i
1b720 6e 74 20 75 6e 69 78 53 68 6d 53 69 7a 65 28 0a  nt unixShmSize(.
1b730 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1b740 66 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  fd,         /* T
1b750 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1b760 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 53 48   file holding SH
1b770 4d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 71 53 69  M */.  int reqSi
1b780 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1b790 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 73 69   /* Requested si
1b7a0 7a 65 2e 20 20 2d 31 20 66 6f 72 20 71 75 65 72  ze.  -1 for quer
1b7b0 79 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  y only */.  int 
1b7c0 2a 70 4e 65 77 53 69 7a 65 20 20 20 20 20 20 20  *pNewSize       
1b7d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1b7e0 65 77 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ew size here */.
1b7f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1b800 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
1b810 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20  *)fd;.  unixShm 
1b820 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1b830 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
1b840 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1b850 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1b860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b870 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
1b880 61 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  at;..  assert( p
1b890 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
1b8a0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
1b8b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1b8c0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
1b8d0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
1b8e0 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
1b8f0 20 20 20 20 69 66 28 20 66 73 74 61 74 28 70 53      if( fstat(pS
1b900 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
1b910 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  t)==0 ){.      *
1b920 70 4e 65 77 53 69 7a 65 20 3d 20 28 69 6e 74 29  pNewSize = (int)
1b930 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b 0a 20  sStat.st_size;. 
1b940 20 20 20 20 20 69 66 28 20 72 65 71 53 69 7a 65       if( reqSize
1b950 3c 3d 28 69 6e 74 29 73 53 74 61 74 2e 73 74 5f  <=(int)sStat.st_
1b960 73 69 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  size ) break;.  
1b970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
1b980 70 4e 65 77 53 69 7a 65 20 3d 20 30 3b 0a 20 20  pNewSize = 0;.  
1b990 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b9a0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
1b9b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b9c0 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 72 75 6e  }.    rc = ftrun
1b9d0 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
1b9e0 2c 20 72 65 71 53 69 7a 65 29 3b 0a 20 20 20 20  , reqSize);.    
1b9f0 72 65 71 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  reqSize = -1;.  
1ba00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ba10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
1ba20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  the lock held on
1ba30 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1ba40 72 79 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68  ry segment to th
1ba50 61 74 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65  at other.** thre
1ba60 61 64 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  ads are free to 
1ba70 72 65 73 69 7a 65 20 69 74 20 69 66 20 6e 65 63  resize it if nec
1ba80 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
1ba90 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74   the lock is not
1baa0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2c   currently held,
1bab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1bac0 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
1bad0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
1bae0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6f 62  shared-memory ob
1baf0 6a 65 63 74 20 69 73 20 69 6e 20 6c 6f 63 6b 20  ject is in lock 
1bb00 73 74 61 74 65 20 52 45 43 4f 56 45 52 2c 20 74  state RECOVER, t
1bb10 68 65 6e 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  hen we do not.**
1bb20 20 72 65 61 6c 6c 79 20 77 61 6e 74 20 74 6f 20   really want to 
1bb30 72 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  release the lock
1bb40 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
1bb50 65 20 74 6f 6f 2c 20 74 68 69 73 20 72 6f 75 74  e too, this rout
1bb60 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ine.** is a no-o
1bb70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1bb80 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 28   unixShmRelease(
1bb90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1bba0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1bbb0 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
1bbc0 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20  *)fd;.  unixShm 
1bbd0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1bbe0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 68 61 73 4d  ;..  if( p->hasM
1bbf0 75 74 65 78 42 75 66 20 29 7b 0a 20 20 20 20 61  utexBuf ){.    a
1bc00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1bc10 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 2d 3e  utex_notheld(p->
1bc20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1bc30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1bc40 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70  mutex_leave(p->p
1bc50 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75  ShmNode->mutexBu
1bc60 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75  f);.    p->hasMu
1bc70 74 65 78 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a  texBuf = 0;.  }.
1bc80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bc90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70  OK;.}../*.** Map
1bca0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 6f 72   the shared stor
1bcb0 61 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  age into memory.
1bcc0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 4d 61   .**.** If reqMa
1bcd0 70 53 69 7a 65 20 69 73 20 70 6f 73 69 74 69 76  pSize is positiv
1bce0 65 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  e, then an attem
1bcf0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6d 61  pt is made to ma
1bd00 6b 65 20 74 68 65 0a 2a 2a 20 6d 61 70 70 69 6e  ke the.** mappin
1bd10 67 20 61 74 20 6c 65 61 73 74 20 72 65 71 4d 61  g at least reqMa
1bd20 70 53 69 7a 65 20 62 79 74 65 73 20 69 6e 20 73  pSize bytes in s
1bd30 69 7a 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ize.  However, t
1bd40 68 65 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 77 69  he mapping.** wi
1bd50 6c 6c 20 6e 65 76 65 72 20 62 65 20 6c 61 72 67  ll never be larg
1bd60 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
1bd70 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1bd80 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1bd90 0a 2a 2a 20 61 73 20 73 65 74 20 62 79 20 70 72  .** as set by pr
1bda0 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 78 53 68  ior calls to xSh
1bdb0 6d 53 69 7a 65 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  mSize().  .**.**
1bdc0 20 2a 70 70 42 75 66 20 69 73 20 6d 61 64 65 20   *ppBuf is made 
1bdd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1bde0 6d 65 6d 6f 72 79 20 77 68 69 63 68 20 69 73 20  memory which is 
1bdf0 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65  a mapping of the
1be00 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  .** underlying s
1be10 74 6f 72 61 67 65 2e 20 20 41 20 6d 75 74 65 78  torage.  A mutex
1be20 20 69 73 20 61 63 71 75 69 72 65 64 20 74 6f 20   is acquired to 
1be30 70 72 65 76 65 6e 74 20 6f 74 68 65 72 20 74 68  prevent other th
1be40 72 65 61 64 73 0a 2a 2a 20 66 72 6f 6d 20 72 75  reads.** from ru
1be50 6e 6e 69 6e 67 20 77 68 69 6c 65 20 2a 70 70 42  nning while *ppB
1be60 75 66 20 69 73 20 69 6e 20 75 73 65 20 69 6e 20  uf is in use in 
1be70 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74  order to prevent
1be80 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 0a 2a   other threads.*
1be90 2a 20 72 65 6d 61 70 70 69 6e 67 20 2a 70 70 42  * remapping *ppB
1bea0 75 66 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  uf out from unde
1beb0 72 20 74 68 69 73 20 74 68 72 65 61 64 2e 20 20  r this thread.  
1bec0 54 68 65 20 75 6e 69 78 53 68 6d 52 65 6c 65 61  The unixShmRelea
1bed0 73 65 28 29 0a 2a 2a 20 63 61 6c 6c 20 77 69 6c  se().** call wil
1bee0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75  l release the mu
1bef0 74 65 78 2e 20 20 48 6f 77 65 76 65 72 2c 20 69  tex.  However, i
1bf00 66 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  f the lock state
1bf10 20 69 73 20 43 48 45 43 4b 50 4f 49 4e 54 2c 0a   is CHECKPOINT,.
1bf20 2a 2a 20 74 68 65 20 6d 75 74 65 78 20 69 73 20  ** the mutex is 
1bf30 6e 6f 74 20 61 63 71 75 69 72 65 64 20 62 65 63  not acquired bec
1bf40 61 75 73 65 20 43 48 45 43 4b 50 4f 49 4e 54 20  ause CHECKPOINT 
1bf50 77 69 6c 6c 20 6e 65 76 65 72 20 72 65 6d 61 70  will never remap
1bf60 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2e 20   the.** buffer. 
1bf70 20 52 45 43 4f 56 45 52 20 6d 69 67 68 74 20 72   RECOVER might r
1bf80 65 6d 61 70 2c 20 74 68 6f 75 67 68 2c 20 73 6f  emap, though, so
1bf90 20 43 48 45 43 4b 50 4f 49 4e 54 20 77 69 6c 6c   CHECKPOINT will
1bfa0 20 61 63 71 75 69 72 65 0a 2a 2a 20 74 68 65 20   acquire.** the 
1bfb0 6d 75 74 65 78 20 69 66 20 61 6e 64 20 77 68 65  mutex if and whe
1bfc0 6e 20 69 74 20 70 72 6f 6d 6f 74 65 73 20 74 6f  n it promotes to
1bfd0 20 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20   RECOVER..**.** 
1bfe0 52 45 43 4f 56 45 52 20 6e 65 65 64 73 20 74 6f  RECOVER needs to
1bff0 20 62 65 20 61 74 6f 6d 69 63 2e 20 20 54 68 65   be atomic.  The
1c000 20 73 61 6d 65 20 6d 75 74 65 78 20 74 68 61 74   same mutex that
1c010 20 70 72 65 76 65 6e 74 73 20 2a 70 70 42 75 66   prevents *ppBuf
1c020 20 66 72 6f 6d 0a 2a 2a 20 62 65 69 6e 67 20 72   from.** being r
1c030 65 6d 61 70 70 65 64 20 61 6c 73 6f 20 70 72 65  emapped also pre
1c040 76 65 6e 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  vents more than 
1c050 6f 6e 65 20 74 68 72 65 61 64 20 66 72 6f 6d 20  one thread from 
1c060 62 65 69 6e 67 20 69 6e 0a 2a 2a 20 52 45 43 4f  being in.** RECO
1c070 56 45 52 20 61 74 20 61 20 74 69 6d 65 2e 20 20  VER at a time.  
1c080 42 75 74 2c 20 52 45 43 4f 56 45 52 20 73 6f 6d  But, RECOVER som
1c090 65 74 69 6d 65 73 20 77 61 6e 74 73 20 74 6f 20  etimes wants to 
1c0a0 72 65 6d 61 70 20 69 74 73 65 6c 66 2e 0a 2a 2a  remap itself..**
1c0b0 20 54 6f 20 70 72 65 76 65 6e 74 20 52 45 43 4f   To prevent RECO
1c0c0 56 45 52 20 66 72 6f 6d 20 6c 6f 73 69 6e 67 20  VER from losing 
1c0d0 69 74 73 20 6c 6f 63 6b 20 77 68 69 6c 65 20 72  its lock while r
1c0e0 65 6d 61 70 70 69 6e 67 2c 20 74 68 65 0a 2a 2a  emapping, the.**
1c0f0 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 72 65   mutex is not re
1c100 6c 65 61 73 65 64 20 62 79 20 75 6e 69 78 53 68  leased by unixSh
1c110 6d 52 65 6c 65 61 73 65 28 29 20 77 68 65 6e 20  mRelease() when 
1c120 69 6e 20 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a  in RECOVER..**.*
1c130 2a 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 69  * *pNewMapSize i
1c140 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
1c150 65 20 6f 66 20 74 68 65 20 6d 61 70 70 69 6e 67  e of the mapping
1c160 2e 20 20 55 73 75 61 6c 6c 79 20 2a 70 4e 65 77  .  Usually *pNew
1c170 4d 61 70 53 69 7a 65 0a 2a 2a 20 77 69 6c 6c 20  MapSize.** will 
1c180 62 65 20 72 65 71 4d 61 70 53 69 7a 65 20 6f 72  be reqMapSize or
1c190 20 6c 61 72 67 65 72 2c 20 74 68 6f 75 67 68 20   larger, though 
1c1a0 69 74 20 63 6f 75 6c 64 20 62 65 20 73 6d 61 6c  it could be smal
1c1b0 6c 65 72 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e  ler if the.** un
1c1c0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 20  derlying shared 
1c1d0 6d 65 6d 6f 72 79 20 68 61 73 20 6e 65 76 65 72  memory has never
1c1e0 20 62 65 65 6e 20 65 6e 6c 61 72 67 65 64 20 74   been enlarged t
1c1f0 6f 20 72 65 71 4d 61 70 53 69 7a 65 20 62 79 74  o reqMapSize byt
1c200 65 73 0a 2a 2a 20 62 79 20 70 72 69 6f 72 20 63  es.** by prior c
1c210 61 6c 6c 73 20 74 6f 20 78 53 68 6d 53 69 7a 65  alls to xShmSize
1c220 28 29 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66  ()..**.** *ppBuf
1c230 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 61   might be NULL a
1c240 6e 64 20 7a 65 72 6f 20 69 66 20 6e 6f 20 73 70  nd zero if no sp
1c250 61 63 65 20 68 61 73 0a 2a 2a 20 79 65 74 20 62  ace has.** yet b
1c260 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  een allocated to
1c270 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1c280 73 74 6f 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  storage..*/.stat
1c290 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 47 65  ic int unixShmGe
1c2a0 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  t(.  sqlite3_fil
1c2b0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 2f 2a  e *fd,        /*
1c2c0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
1c2d0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1c2e0 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65  mory */.  int re
1c2f0 71 4d 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20  qMapSize,       
1c300 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20     /* Requested 
1c310 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 2e  size of mapping.
1c320 20 2d 31 20 6d 65 61 6e 73 20 64 6f 6e 27 74 20   -1 means don't 
1c330 63 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  care */.  int *p
1c340 4e 65 77 4d 61 70 53 69 7a 65 2c 20 20 20 20 20  NewMapSize,     
1c350 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1c360 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20  size of mapping 
1c370 68 65 72 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76  here */.  void v
1c380 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 42 75 66 20  olatile **ppBuf 
1c390 20 20 20 2f 2a 20 57 72 69 74 65 20 6d 61 70 70     /* Write mapp
1c3a0 69 6e 67 20 62 75 66 66 65 72 20 6f 72 69 67 69  ing buffer origi
1c3b0 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  n here */.){.  u
1c3c0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
1c3d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
1c3e0 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
1c3f0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e  DbFd->pShm;.  un
1c400 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1c410 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1c420 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1c430 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1c440 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
1c450 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
1c460 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
1c470 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
1c480 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
1c490 64 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  de );..  if( p->
1c4a0 68 61 73 4d 75 74 65 78 42 75 66 3d 3d 30 20 29  hasMutexBuf==0 )
1c4b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
1c4c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
1c4d0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
1c4e0 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
1c4f0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1c500 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42  pShmNode->mutexB
1c510 75 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d  uf);.    p->hasM
1c520 75 74 65 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d  utexBuf = 1;.  }
1c530 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c540 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1c550 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70  >mutex);.  if( p
1c560 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 3d 3d  ShmNode->szMap==
1c570 30 20 7c 7c 20 72 65 71 4d 61 70 53 69 7a 65 3e  0 || reqMapSize>
1c580 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20  pShmNode->szMap 
1c590 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 75 61  ){.    int actua
1c5a0 6c 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 75  lSize;.    if( u
1c5b0 6e 69 78 53 68 6d 53 69 7a 65 28 66 64 2c 20 2d  nixShmSize(fd, -
1c5c0 31 2c 20 26 61 63 74 75 61 6c 53 69 7a 65 29 21  1, &actualSize)!
1c5d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c5e0 20 20 20 20 61 63 74 75 61 6c 53 69 7a 65 20 3d      actualSize =
1c5f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
1c600 71 4d 61 70 53 69 7a 65 20 3d 20 61 63 74 75 61  qMapSize = actua
1c610 6c 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70  lSize;.    if( p
1c620 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75  ShmNode->pMMapBu
1c630 66 20 7c 7c 20 72 65 71 4d 61 70 53 69 7a 65 3c  f || reqMapSize<
1c640 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 75 6e 6d  =0 ){.      munm
1c650 61 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d  ap(pShmNode->pMM
1c660 61 70 42 75 66 2c 20 70 53 68 6d 4e 6f 64 65 2d  apBuf, pShmNode-
1c670 3e 73 7a 4d 61 70 29 3b 0a 20 20 20 20 7d 0a 20  >szMap);.    }. 
1c680 20 20 20 69 66 28 20 72 65 71 4d 61 70 53 69 7a     if( reqMapSiz
1c690 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 53 68  e>0 ){.      pSh
1c6a0 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20  mNode->pMMapBuf 
1c6b0 3d 20 6d 6d 61 70 28 30 2c 20 72 65 71 4d 61 70  = mmap(0, reqMap
1c6c0 53 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 7c  Size, PROT_READ|
1c6d0 50 52 4f 54 5f 57 52 49 54 45 2c 20 4d 41 50 5f  PROT_WRITE, MAP_
1c6e0 53 48 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20  SHARED,.        
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c700 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
1c710 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  , 0);.      pShm
1c720 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20 3d 20 70 53  Node->szMap = pS
1c730 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66  hmNode->pMMapBuf
1c740 20 3f 20 72 65 71 4d 61 70 53 69 7a 65 20 3a 20   ? reqMapSize : 
1c750 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1c760 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d      pShmNode->pM
1c770 4d 61 70 42 75 66 20 3d 20 30 3b 0a 20 20 20 20  MapBuf = 0;.    
1c780 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61    pShmNode->szMa
1c790 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  p = 0;.    }.  }
1c7a0 0a 20 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20  .  *pNewMapSize 
1c7b0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61  = pShmNode->szMa
1c7c0 70 3b 0a 20 20 2a 70 70 42 75 66 20 3d 20 70 53  p;.  *ppBuf = pS
1c7d0 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66  hmNode->pMMapBuf
1c7e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1c7f0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1c800 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1c810 2a 70 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  *ppBuf==0 ){.   
1c820 20 2f 2a 20 44 6f 20 6e 6f 74 20 68 6f 6c 64 20   /* Do not hold 
1c830 74 68 65 20 6d 75 74 65 78 20 69 66 20 61 20 4e  the mutex if a N
1c840 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 62  ULL pointer is b
1c850 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 20 2a  eing returned. *
1c860 2f 0a 20 20 20 20 75 6e 69 78 53 68 6d 52 65 6c  /.    unixShmRel
1c870 65 61 73 65 28 66 64 29 3b 0a 20 20 7d 0a 20 20  ease(fd);.  }.  
1c880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c890 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1c8a0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
1c8b0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
1c8c0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
1c8d0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
1c8e0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
1c8f0 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
1c900 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
1c910 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
1c920 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
1c930 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
1c940 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
1c950 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
1c960 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
1c970 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
1c980 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
1c990 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
1c9a0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
1c9b0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
1c9c0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1c9d0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
1c9e0 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
1c9f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1ca00 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
1ca10 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1ca20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1ca30 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
1ca40 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1ca50 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca70 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
1ca80 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
1ca90 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1cac0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
1cad0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1cae0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb00 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
1cb10 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
1cb20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
1cb30 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
1cb40 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
1cb50 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
1cb60 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1cb70 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
1cb80 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
1cb90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
1cba0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
1cbb0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
1cbc0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbe0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1cbf0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
1cc00 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
1cc10 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
1cc20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
1cc30 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1cc40 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
1cc50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cc60 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1cc70 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1cc80 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
1cc90 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
1ccc0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
1ccd0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
1cce0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
1ccf0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1cd00 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
1cd10 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
1cd20 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
1cd30 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
1cd40 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
1cd50 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
1cd60 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1cd70 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
1cd80 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
1cd90 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
1cda0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1cdb0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1cdc0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
1cdd0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1cde0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
1cdf0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
1ce00 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
1ce10 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
1ce20 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
1ce30 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
1ce40 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
1ce50 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
1ce60 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
1ce70 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
1ce80 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1ce90 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
1cea0 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
1ceb0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61  - (1<<ofst);.  a
1cec0 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
1ced0 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
1cee0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1cef0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1cf00 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
1cf10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1cf20 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
1cf30 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
1cf40 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
1cf50 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
1cf60 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
1cf70 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
1cf80 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
1cf90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
1cfa0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1cfb0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1cfc0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1cfd0 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
1cfe0 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
1cff0 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
1d000 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
1d010 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
1d020 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
1d030 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
1d040 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
1d050 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
1d060 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
1d070 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
1d080 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
1d090 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1d0a0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1d0b0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e  k(pShmNode, F_UN
1d0c0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
1d0d0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1d0e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d0f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d100 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
1d110 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
1d120 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1d130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d140 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
1d150 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
1d160 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1d170 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
1d180 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
1d190 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
1d1a0 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
1d1b0 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
1d1c0 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
1d1d0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
1d1e0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
1d1f0 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
1d200 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
1d210 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
1d220 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
1d230 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1d240 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
1d250 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
1d260 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
1d270 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
1d280 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
1d290 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
1d2a0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
1d2b0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1d2c0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1d2d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1d2e0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1d2f0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1d300 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1d310 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1d320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1d330 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
1d340 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1d350 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1d360 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
1d370 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1d380 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
1d390 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
1d3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d3b0 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
1d3c0 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
1d3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d3e0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1d3f0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
1d400 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  DLCK, ofst+UNIX_
1d410 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1d420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d430 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d440 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
1d450 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
1d460 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
1d470 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
1d480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d490 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1d4a0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1d4b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d4c0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
1d4d0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1d4e0 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
1d4f0 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
1d500 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
1d510 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
1d520 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
1d530 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
1d540 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1d550 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1d560 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1d570 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1d580 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1d590 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
1d5a0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
1d5b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1d5c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d5d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1d5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d5f0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1d600 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1d610 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1d620 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
1d630 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
1d640 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
1d650 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
1d660 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
1d670 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1d680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d690 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
1d6a0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1d6b0 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
1d6c0 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
1d6d0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
1d6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d6f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1d700 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
1d710 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
1d720 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
1d730 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1d740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d750 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d760 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1d770 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
1d780 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
1d790 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
1d7a0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
1d7b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
1d7c0 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68   getpid(), p->sh
1d7d0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1d7e0 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72  lMask));.  retur
1d7f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1d800 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
1d810 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
1d820 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
1d830 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
1d840 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
1d850 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
1d860 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
1d870 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
1d880 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
1d890 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
1d8a0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
1d8b0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
1d8c0 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69  oid unixShmBarri
1d8d0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
1d8e0 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
1d8f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1d900 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1d910 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
1d920 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  {.  unixEnterMut
1d930 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  ex();.  unixLeav
1d940 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 0a 23 65  eMutex();.}...#e
1d950 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
1d960 78 53 68 6d 4f 70 65 6e 20 20 20 20 30 0a 23 20  xShmOpen    0.# 
1d970 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 53 69  define unixShmSi
1d980 7a 65 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ze    0.# define
1d990 20 75 6e 69 78 53 68 6d 47 65 74 20 20 20 20 20   unixShmGet     
1d9a0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
1d9b0 68 6d 52 65 6c 65 61 73 65 20 30 0a 23 20 64 65  hmRelease 0.# de
1d9c0 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
1d9d0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
1d9e0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
1d9f0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
1da00 43 6c 6f 73 65 20 20 20 30 0a 23 65 6e 64 69 66  Close   0.#endif
1da10 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
1da20 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
1da30 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
1da40 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
1da50 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
1da60 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
1da70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1da80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
1da90 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
1daa0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1dab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dac0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1dad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1daf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
1db20 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
1db30 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
1db40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1db50 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
1db60 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
1db70 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
1db80 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
1db90 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
1dba0 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
1dbb0 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
1dbc0 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
1dbd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1dbe0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
1dbf0 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
1dc00 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1dc10 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
1dc20 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1dc30 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
1dc40 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
1dc50 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
1dc60 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
1dc70 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
1dc80 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
1dc90 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
1dca0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
1dcb0 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
1dcc0 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
1dcd0 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
1dce0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
1dcf0 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
1dd00 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
1dd10 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
1dd20 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
1dd30 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
1dd40 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
1dd50 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
1dd60 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
1dd70 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
1dd80 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
1dd90 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
1dda0 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
1ddb0 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
1ddc0 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  funtion F, two o
1ddd0 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
1dde0 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
1ddf0 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
1de00 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
1de10 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
1de20 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
1de30 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
1de40 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
1de50 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
1de60 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
1de70 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
1de80 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
1de90 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
1dea0 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
1deb0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
1dec0 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
1ded0 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
1dee0 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
1def0 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
1df00 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
1df10 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
1df20 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
1df30 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
1df40 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
1df50 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
1df60 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
1df70 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
1df80 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
1df90 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
1dfa0 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
1dfb0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1dfc0 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
1dfd0 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
1dfe0 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
1dff0 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
1e000 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
1e010 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
1e020 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
1e030 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
1e040 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
1e050 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
1e060 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
1e070 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
1e080 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
1e090 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
1e0a0 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54  HODS(FINDER, MET
1e0b0 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c  HOD, VERSION, CL
1e0c0 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
1e0d0 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
1e0e0 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
1e0f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1e100 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e130 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1e180 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e1a0 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e1d0 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e1f0 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e220 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e240 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1e270 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
1e280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e290 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1e2c0 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
1e2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1e2e0 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1e310 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
1e320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1e330 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
1e360 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
1e370 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1e380 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
1e3b0 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
1e3c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1e3d0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3f0 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
1e400 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
1e410 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
1e420 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
1e450 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
1e460 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
1e470 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
1e4a0 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
1e4b0 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
1e4c0 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
1e4f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1e500 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
1e510 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4f 70    \.   unixShmOp
1e540 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1e550 20 20 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a     /* xShmOpen *
1e560 2f 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 20 20 20 20 20 20                  
1e580 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 53 69 7a   \.   unixShmSiz
1e590 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1e5a0 20 20 2f 2a 20 78 53 68 6d 53 69 7a 65 20 2a 2f    /* xShmSize */
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 20 20 20 20 20 20 20                  
1e5d0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 47 65 74 2c  \.   unixShmGet,
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 2f 2a 20 78 53 68 6d 47 65 74 20 2a 2f 20 20   /* xShmGet */  
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e620 0a 20 20 20 75 6e 69 78 53 68 6d 52 65 6c 65 61  .   unixShmRelea
1e630 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1e640 2f 2a 20 78 53 68 6d 52 65 6c 65 61 73 65 20 2a  /* xShmRelease *
1e650 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1e670 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e690 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e6c0 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
1e6d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e6e0 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e710 20 75 6e 69 78 53 68 6d 43 6c 6f 73 65 20 20 20   unixShmClose   
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e730 78 53 68 6d 43 6c 6f 73 65 20 2a 2f 20 20 20 20  xShmClose */    
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 20 20 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 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
1e7b0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1e7c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
1e7d0 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
1e7e0 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
1e7f0 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
1e800 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
1e810 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
1e820 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
1e850 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
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 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
1e8f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1e900 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
1e910 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
1e920 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
1e930 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
1e940 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
1e950 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
1e960 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
1e970 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
1e980 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
1e990 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
1e9a0 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
1e9b0 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
1e9c0 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
1e9d0 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
1e9e0 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
1e9f0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
1ea00 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
1ea10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
1ea20 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
1ea30 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
1ea40 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
1ea50 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1ea60 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
1ea70 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20   */.  2,        
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 65 6e  /* ShmOpen is en
1eaa0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
1eab0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1eac0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1ead0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
1eae0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1eaf0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1eb00 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
1eb10 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1eb20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1eb30 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
1eb40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1eb50 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
1eb60 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1eb70 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
1eb80 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64  (.  nolockIoFind
1eb90 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
1eba0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1ebb0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
1ebc0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1ebd0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1ebe0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1ebf0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e        /* ShmOpen
1ec20 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
1ec30 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ec50 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1ec60 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ec80 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1ec90 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
1eca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1ecb0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1ecc0 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
1ecd0 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78  ervedLock   /* x
1ece0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1ecf0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
1ed00 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f  METHODS(.  dotlo
1ed10 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
1ed20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1ed30 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1ed40 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f    dotlockIoMetho
1ed50 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ds,         /* s
1ed60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1ed70 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1ed80 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eda0 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62  ShmOpen is disab
1edb0 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
1edc0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1edd0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1ede0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
1edf0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1ee00 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1ee10 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
1ee20 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1ee30 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1ee40 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
1ee50 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1ee60 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
1ee70 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1ee80 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
1ee90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1eea0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
1eeb0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
1eec0 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1eee0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1eef0 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
1ef00 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
1ef10 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1ef20 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1ef30 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69      /* ShmOpen i
1ef60 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
1ef70 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
1ef80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1ef90 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1efa0 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
1efb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1efc0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
1efd0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
1efe0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1eff0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1f000 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
1f010 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
1f020 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1f030 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
1f040 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
1f050 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
1f060 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
1f070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
1f080 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
1f090 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
1f0a0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
1f0b0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
1f0c0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
1f0d0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20    /* ShmOpen is 
1f100 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65  disabled */.  se
1f110 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
1f120 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1f130 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  e method */.  se
1f140 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
1f150 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1f160 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
1f170 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1f180 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
1f190 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
1f1a0 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
1f1b0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
1f1c0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
1f1d0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
1f1e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1f1f0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1f200 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1f210 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
1f220 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
1f230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1f240 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1f250 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
1f260 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1f270 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1f280 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1f290 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65         /* ShmOpe
1f2c0 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  n is disabled */
1f2d0 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f2f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1f300 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f320 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1f330 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
1f340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f350 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1f360 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
1f370 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
1f380 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1f390 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1f3a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1f3b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
1f3c0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
1f3d0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
1f3e0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
1f3f0 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
1f400 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1f410 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
1f420 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
1f430 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
1f440 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
1f450 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
1f460 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1f470 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
1f480 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
1f490 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
1f4a0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
1f4b0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
1f4c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
1f4d0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
1f4e0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
1f4f0 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
1f500 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
1f510 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
1f520 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1f530 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
1f540 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1f550 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
1f560 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
1f570 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
1f580 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
1f590 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1f5a0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1f5b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1f5c0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
1f5d0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
1f5e0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
1f5f0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
1f600 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1f610 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
1f620 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
1f630 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
1f640 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
1f650 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
1f660 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1f670 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
1f680 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
1f690 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1f6a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
1f6b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
1f6c0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
1f6d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1f6e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1f6f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
1f700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f710 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f           /* ShmO
1f720 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20  pen is disabled 
1f730 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c  */.  proxyClose,
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f750 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
1f760 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20  */.  proxyLock, 
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f780 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
1f790 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c  /.  proxyUnlock,
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f7b0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1f7c0 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52  */.  proxyCheckR
1f7d0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
1f7e0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1f7f0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1f800 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
1f810 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
1f820 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
1f830 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
1f840 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
1f850 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
1f860 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1f870 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1f880 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
1f890 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
1f8a0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1f8b0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1f8c0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1f8d0 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f8f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1f900 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1f910 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64 69  /* ShmOpen is di
1f940 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  sabled */.  unix
1f950 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1f960 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1f970 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
1f980 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
1f990 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1f9a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73   method */.  nfs
1f9b0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1f9c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1f9d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
1f9e0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
1f9f0 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
1fa00 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1fa10 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
1fa20 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1fa30 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1fa40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1fa50 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
1fa60 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
1fa70 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1fa80 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1fa90 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
1faa0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
1fab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fac0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
1fad0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
1fae0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1faf0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
1fb00 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
1fb10 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
1fb20 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
1fb30 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
1fb40 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1fb50 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1fb60 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
1fb70 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
1fb80 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
1fb90 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
1fba0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fbb0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
1fbc0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
1fbd0 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
1fbe0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
1fbf0 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
1fc00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1fc10 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
1fc20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1fc30 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
1fc40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
1fc50 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
1fc60 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
1fc70 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1fc80 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
1fc90 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
1fca0 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
1fcb0 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
1fcc0 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
1fcd0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
1fce0 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
1fcf0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
1fd00 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
1fd10 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
1fd20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
1fd30 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
1fd40 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
1fd50 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
1fd60 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
1fd70 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
1fd80 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
1fd90 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
1fda0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
1fdb0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
1fdc0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
1fdd0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
1fde0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
1fdf0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
1fe00 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
1fe10 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
1fe20 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1fe30 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
1fe40 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
1fe50 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
1fe60 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
1fe70 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
1fe80 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
1fe90 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
1fea0 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
1feb0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1fec0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
1fed0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1fee0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
1fef0 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
1ff00 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
1ff10 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
1ff20 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
1ff30 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
1ff40 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
1ff50 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
1ff60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ff70 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
1ff80 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
1ff90 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
1ffa0 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
1ffb0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
1ffc0 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
1ffd0 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
1ffe0 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
1fff0 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
20000 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
20010 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
20020 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
20030 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
20040 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
20050 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
20060 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
20070 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
20080 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
20090 0a 20 20 69 66 28 20 66 63 6e 74 6c 28 70 4e 65  .  if( fcntl(pNe
200a0 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
200b0 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
200c0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
200d0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
200e0 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
200f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20100 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
20110 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
20120 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
20130 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
20140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
20150 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
20160 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
20170 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
20180 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
20190 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
201a0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
201b0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
201c0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
201d0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
201e0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
201f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
20200 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
20210 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
20220 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
20230 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20240 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
20250 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
20260 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
20270 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
20280 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
20290 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
202a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
202b0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
202c0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
202d0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
202e0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
202f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
20300 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
20310 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
20320 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
20330 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
20340 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
20350 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
20360 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
20370 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
20380 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
20390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
203a0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
203b0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
203c0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
203d0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
203e0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
203f0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
20400 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
20410 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
20420 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
20430 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
20440 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
20450 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
20460 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
20470 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
20480 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
20490 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
204a0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
204b0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
204c0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
204d0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
204e0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
204f0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
20500 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
20510 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
20520 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
20530 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
20540 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
20550 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
20560 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
20570 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
20580 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28  CK;.  if( fcntl(
20590 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
205a0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
205b0 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
205c0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
205d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
205e0 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
205f0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
20600 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
20610 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
20620 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
20630 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
20640 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
20650 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
20660 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
20670 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
20680 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
20690 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
206a0 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
206b0 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
206c0 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
206d0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
206e0 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
206f0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
20700 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
20710 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
20720 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
20730 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
20740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20780 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
207a0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
207b0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
207c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
207d0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
207e0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
207f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
20800 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
20810 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
20820 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
20830 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
20840 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
20850 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
20860 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
20870 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
20880 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
20890 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
208a0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
208b0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
208c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
208d0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
208e0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
208f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
20900 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
20910 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  d */.  int dirfd
20920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20930 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
20940 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
20950 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
20960 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74  Id,      /* Writ
20970 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
20980 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
20990 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
209a0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
209b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
209c0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
209d0 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20  /.  int noLock, 
209e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
209f0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74  mit locking if t
20a00 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  rue */.  int isD
20a10 65 6c 65 74 65 20 20 20 20 20 20 20 20 20 20 20  elete           
20a20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
20a30 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ose if true */.)
20a40 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
20a50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
20a60 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
20a70 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
20a80 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
20a90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20aa0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
20ab0 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
20ac0 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  NULL );..  /* Pa
20ad0 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65  rameter isDelete
20ae0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e   is only used on
20af0 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65 73   vxworks. Expres
20b00 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74 6c  s this explicitl
20b10 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f 20  y .  ** here to 
20b20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
20b30 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
20b40 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
20b50 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  s..  */.  UNUSED
20b60 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c  _PARAMETER(isDel
20b70 65 74 65 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  ete);..  OSTRACE
20b80 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  (("OPEN    %-3d 
20b90 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  %s\n", h, zFilen
20ba0 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68  ame));.  pNew->h
20bb0 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69   = h;.  pNew->di
20bc0 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 70  rfd = dirfd;.  p
20bd0 4e 65 77 2d 3e 66 69 6c 65 46 6c 61 67 73 20 3d  New->fileFlags =
20be0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 46   0;.  assert( zF
20bf0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
20c00 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
20c10 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 61 20 72  );  /* Never a r
20c20 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
20c30 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74   */.  pNew->zPat
20c40 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  h = zFilename;..
20c50 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
20c60 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
20c70 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
20c80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
20c90 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
20ca0 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  .    noLock = 1;
20cb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
20cc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
20cd0 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  if..  if( noLock
20ce0 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
20cf0 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
20d00 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
20d10 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
20d20 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
20d30 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
20d40 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
20d50 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
20d60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20d70 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
20d80 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
20d90 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
20da0 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
20db0 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
20dc0 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
20dd0 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
20de0 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
20df0 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
20e00 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
20e10 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
20e20 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
20e30 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
20e40 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
20e50 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
20e60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
20e70 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
20e80 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
20e90 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
20ea0 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
20eb0 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
20ec0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
20ed0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
20ee0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
20ef0 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
20f00 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
20f10 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
20f20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
20f30 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
20f40 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
20f50 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
20f60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
20f80 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20f90 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  cured in findIno
20fa0 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
20fb0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
20fc0 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
20fd0 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
20fe0 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
20ff0 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
21000 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
21010 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
21020 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
21030 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
21040 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
21050 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
21060 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
21070 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
21080 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
21090 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
210a0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
210b0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
210c0 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
210d0 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
210e0 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
210f0 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
21100 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
21110 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
21120 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
21130 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
21140 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
21150 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
21160 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
21170 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
21180 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
21190 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
211a0 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
211b0 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
211c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
211d0 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
211e0 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
211f0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
21200 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
21210 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
21220 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
21230 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
21240 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
21250 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
21260 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
21270 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
21280 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
21290 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
212a0 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
212b0 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
212c0 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
212d0 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
212e0 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
212f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21300 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20  close(h);.      
21310 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
21320 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
21330 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
21340 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
21350 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
21360 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
21370 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
21380 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
21390 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
213a0 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
213b0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
213c0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
213d0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
213e0 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
213f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
21400 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
21410 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
21420 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
21430 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
21440 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
21450 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
21460 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
21470 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
21480 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21490 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
214a0 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61    /* NB: zFilena
214b0 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65  me exists and re
214c0 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
214d0 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c  l the file is cl
214e0 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63  osed.      ** ac
214f0 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
21500 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
21510 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
21520 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
21530 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
21540 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20   filename. */.  
21550 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
21560 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
21570 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76      pCtx->reserv
21580 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72  ed = 0;.      sr
21590 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20  andomdev();.    
215a0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
215b0 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ();.      rc = f
215c0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
215d0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
215e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
215f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21610 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67  ee(pNew->locking
21620 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
21630 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20    close(h);.    
21640 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
21650 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65    }.      unixLe
21660 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
21670 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
21680 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
21690 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
216a0 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
216b0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
216c0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
216d0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
216e0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
216f0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
21700 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
21710 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
21720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
21730 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
21740 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
21750 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
21760 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
21770 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
21780 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
21790 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
217a0 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  oc(nFilename);. 
217b0 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
217c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
217d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
217e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
217f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
21800 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
21810 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
21820 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
21830 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
21840 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
21850 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
21860 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
21870 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
21880 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
21890 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
218a0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
218b0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
218c0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
218d0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
218e0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
218f0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
21900 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
21910 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
21920 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
21930 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
21940 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
21950 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
21960 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
21970 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
21980 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  Inode->pSem==NUL
21990 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
219a0 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
219b0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
219c0 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
219d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
219e0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
219f0 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
21a00 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
21a30 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
21a40 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
21a50 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
21a60 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
21a70 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
21a80 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
21a90 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
21aa0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73  pInode->pSem = s
21ab0 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
21ac0 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
21ad0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
21ae0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
21af0 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
21b00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21b10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21b20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
21b30 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  de->aSemName[0] 
21b40 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a  = '\0';.      }.
21b50 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
21b60 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
21b70 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77  #endif.  .  pNew
21b80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
21b90 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
21ba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
21bc0 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a  >=0 ) close(h);.
21bd0 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
21be0 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
21bf0 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20  );.    isDelete 
21c00 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
21c10 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65  >isDelete = isDe
21c20 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  lete;.#endif.  i
21c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21c40 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66   ){.    if( dirf
21c50 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72  d>=0 ) close(dir
21c60 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 20 6c  fd); /* silent l
21c70 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c 72  eak if fail, alr
21c80 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f  eady in error */
21c90 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
21ca0 63 6c 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73  close(h);.  }els
21cb0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
21cc0 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
21cd0 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
21ce0 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
21cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21d00 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
21d10 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
21d20 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
21d30 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
21d40 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
21d50 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
21d60 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
21d70 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
21d80 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
21d90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21da0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
21db0 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
21dc0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
21dd0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
21de0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
21df0 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
21e00 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
21e10 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  alue..**.** If S
21e20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21e30 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  rned, the caller
21e40 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
21e50 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74  for closing.** t
21e60 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
21e70 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c  or *pFd using cl
21e80 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ose()..*/.static
21e90 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
21ea0 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ry(const char *z
21eb0 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70  Filename, int *p
21ec0 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  Fd){.  int ii;. 
21ed0 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
21ee0 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41  char zDirname[MA
21ef0 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a  X_PATHNAME+1];..
21f00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21f10 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
21f20 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c   zDirname, "%s",
21f30 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66   zFilename);.  f
21f40 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65  or(ii=(int)strle
21f50 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e  n(zDirname); ii>
21f60 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69  1 && zDirname[ii
21f70 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20  ]!='/'; ii--);. 
21f80 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20   if( ii>0 ){.   
21f90 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20   zDirname[ii] = 
21fa0 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f  '\0';.    fd = o
21fb0 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
21fc0 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
21fd0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
21fe0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f  =0 ){.#ifdef FD_
21ff0 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63  CLOEXEC.      fc
22000 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
22010 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
22020 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
22030 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  XEC);.#endif.   
22040 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
22050 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
22060 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
22070 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
22080 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
22090 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
220a0 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  K:SQLITE_CANTOPE
220b0 4e 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  N_BKPT);.}../*.*
220c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
220d0 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
220e0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
220f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
22100 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
22110 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
22120 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
22130 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
22140 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
22150 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
22160 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 69 6e  ixTempFileDir(in
22170 74 20 61 6c 6c 6f 77 53 68 6d 29 7b 0a 20 20 73  t allowShm){.  s
22180 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
22190 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
221a0 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
221b0 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
221c0 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
221d0 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
221e0 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c     0        /* L
221f0 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
22200 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65  /.  };.  unsigne
22210 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63  d int i;.  struc
22220 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
22230 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
22240 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   0;..  azDirs[0]
22250 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
22260 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28  directory;.  if(
22270 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
22280 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
22290 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 0a 20  ("TMPDIR");.  . 
222a0 20 69 66 28 20 61 6c 6c 6f 77 53 68 6d 20 29 7b   if( allowShm ){
222b0 0a 20 20 20 20 7a 44 69 72 20 3d 20 22 2f 64 65  .    zDir = "/de
222c0 76 2f 73 68 6d 22 3b 0a 20 20 20 20 69 20 3d 20  v/shm";.    i = 
222d0 32 3b 20 20 2f 2a 20 53 6b 69 70 20 74 68 65 20  2;  /* Skip the 
222e0 61 70 70 2d 64 65 66 69 6e 65 64 20 74 65 6d 70  app-defined temp
222f0 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 73   locations for s
22300 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
22310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 69    }else{.    zDi
22320 72 20 3d 20 61 7a 44 69 72 73 5b 30 5d 3b 0a 20  r = azDirs[0];. 
22330 20 20 20 69 20 3d 20 31 3b 0a 20 20 7d 0a 20 20     i = 1;.  }.  
22340 66 6f 72 28 3b 20 69 3c 73 69 7a 65 6f 66 28 61  for(; i<sizeof(a
22350 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
22360 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
22370 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
22380 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63   if( zDir==0 ) c
22390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
223a0 20 73 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66   stat(zDir, &buf
223b0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
223c0 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
223d0 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
223e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
223f0 21 61 6c 6c 6f 77 53 68 6d 20 26 26 20 61 63 63  !allowShm && acc
22400 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
22410 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
22420 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
22430 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
22440 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
22450 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
22460 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
22470 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
22480 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
22490 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
224a0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
224b0 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
224c0 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
224d0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
224e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
224f0 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
22500 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
22510 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
22520 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
22530 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
22540 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
22550 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
22560 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
22570 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
22580 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
22590 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
225a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
225b0 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
225c0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
225d0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
225e0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
225f0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
22600 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
22610 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
22620 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
22630 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
22640 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
22650 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
22660 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
22670 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
22680 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
22690 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
226a0 44 69 72 28 30 29 3b 0a 20 20 69 66 28 20 7a 44  Dir(0);.  if( zD
226b0 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22  ir==0 ) zDir = "
226c0 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .";..  /* Check 
226d0 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
226e0 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
226f0 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
22700 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
22710 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
22720 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
22730 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
22740 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
22750 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
22760 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
22770 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d  PREFIX) + 17) >=
22780 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
22790 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
227a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
227b0 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
227c0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
227d0 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  7, zBuf, "%s/"SQ
227e0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
227f0 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
22800 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
22810 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
22820 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
22830 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
22840 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
22850 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
22860 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
22870 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
22880 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
22890 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
228a0 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
228b0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
228c0 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
228d0 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
228e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
228f0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
22900 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22910 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
22920 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
22930 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
22940 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
22950 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
22960 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
22970 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
22980 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
22990 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
229a0 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
229b0 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
229c0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
229d0 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
229e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
229f0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
22a00 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
22a10 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
22a20 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
22a30 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
22a40 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
22a50 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
22a60 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
22a70 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
22a80 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
22a90 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
22aa0 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
22ab0 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
22ac0 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
22ad0 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
22ae0 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
22af0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
22b00 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
22b10 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
22b20 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
22b30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
22b40 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
22b50 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22b60 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
22b70 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
22b80 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
22b90 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
22ba0 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
22bb0 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
22bc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
22bd0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
22be0 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
22bf0 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
22c00 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
22c10 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
22c20 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
22c30 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
22c40 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
22c50 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
22c60 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
22c70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
22c80 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
22c90 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
22ca0 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
22cb0 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
22cc0 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
22cd0 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
22ce0 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
22cf0 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
22d00 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
22d10 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
22d20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
22d30 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
22d40 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
22d50 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
22d60 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
22d70 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
22d80 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
22d90 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
22da0 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
22db0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
22dc0 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
22dd0 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
22de0 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
22df0 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
22e00 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
22e10 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
22e20 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
22e30 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
22e40 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
22e50 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
22e60 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
22e70 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
22e80 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
22e90 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
22ea0 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
22eb0 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
22ec0 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
22ed0 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
22ee0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
22ef0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22f00 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
22f10 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
22f20 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
22f30 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
22f40 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
22f50 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
22f60 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
22f70 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
22f80 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
22f90 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
22fa0 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
22fb0 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
22fc0 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
22fd0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
22fe0 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
22ff0 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
23000 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
23010 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
23020 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
23030 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
23040 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
23050 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
23060 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
23070 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
23080 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
23090 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
230a0 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
230b0 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
230c0 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
230d0 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
230e0 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
230f0 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20   resusable file 
23100 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
23110 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
23120 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68  f( 0==stat(zPath
23130 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
23140 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
23150 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
23160 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
23170 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
23180 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
23190 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
231a0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
231b0 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
231e0 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
231f0 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
23200 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
23210 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
23220 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
23230 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
23240 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
23250 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
23260 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
23270 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
23280 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
23290 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
232a0 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
232b0 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
232c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
232d0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
232e0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
232f0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
23300 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
23310 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
23320 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
23330 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
23340 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
23350 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
23360 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
23370 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
23380 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
23390 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
233a0 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
233b0 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
233c0 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
233d0 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
233e0 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
233f0 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
23400 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
23410 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
23420 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
23430 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
23440 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
23450 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
23460 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
23470 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
23480 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
23490 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
234a0 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
234b0 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
234c0 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
234d0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
234e0 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
234f0 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
23500 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
23510 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
23520 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
23530 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
23540 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
23550 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
23560 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
23570 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
23580 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
23590 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
235a0 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
235b0 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
235c0 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
235d0 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
235e0 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
235f0 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
23600 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
23610 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
23620 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
23630 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
23640 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
23650 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
23660 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
23670 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
23680 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23690 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
236a0 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
236b0 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
236c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
236d0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
236e0 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
236f0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
23700 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
23710 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
23720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23730 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
23740 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
23750 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
23760 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
23770 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
23780 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
23790 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
237a0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
237b0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
237c0 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
237d0 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
237e0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
237f0 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
23800 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
23810 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23830 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
23840 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
23850 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
23860 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23870 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
23880 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
23890 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
238a0 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
238b0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
238c0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
238d0 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
238e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
238f0 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
23900 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
23910 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
23920 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
23930 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
23940 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20  eturn Code */.. 
23950 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
23960 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23970 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
23980 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
23990 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
239a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
239b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
239c0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
239d0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
239e0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
239f0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
23a00 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
23a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23a20 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
23a30 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
23a40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23a50 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
23a60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23a70 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
23a80 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
23a90 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23aa0 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
23ab0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
23ac0 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
23ad0 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
23ae0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
23af0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
23b00 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
23b10 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
23b20 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
23b30 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
23b40 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
23b50 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
23b60 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
23b70 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
23b80 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
23b90 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
23ba0 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  t isOpenDirector
23bb0 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  y = (isCreate &&
23bc0 20 0a 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d   .      (eType==
23bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
23be0 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  ER_JOURNAL || eT
23bf0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
23c00 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
23c10 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   );..  /* If arg
23c20 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
23c30 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
23c40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23c50 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
23c60 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
23c70 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
23c80 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
23c90 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
23ca0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
23cb0 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
23cc0 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74  NAME+1];.  const
23cd0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a   char *zName = z
23ce0 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Path;..  /* Chec
23cf0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
23d00 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
23d10 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
23d20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
23d30 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
23d40 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
23d50 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
23d60 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
23d70 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
23d80 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
23d90 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
23da0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
23db0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
23dc0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
23dd0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
23de0 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
23df0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
23e00 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
23e10 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
23e20 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
23e30 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
23e40 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
23e50 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
23e60 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
23e70 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
23e80 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
23e90 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
23ea0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
23eb0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
23ec0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
23ed0 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
23ee0 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
23ef0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
23f00 6e 20 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d  n journal, and m
23f10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
23f20 65 20 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69  e never automati
23f30 63 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74  cally.  ** delet
23f40 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
23f50 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
23f60 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
23f70 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23f80 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23f90 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23fa0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
23fb0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23fc0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23fd0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23fe0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
23ff0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24000 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24010 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24020 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
24030 4e 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  NAL );..  /* Ass
24040 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
24050 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
24060 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
24070 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
24080 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
24090 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
240a0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
240b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
240c0 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
240d0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
240e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
240f0 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
24100 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
24110 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
24120 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
24130 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
24140 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
24150 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
24160 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
24170 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
24180 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
24190 44 42 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  DB.  );..  memse
241a0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
241b0 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
241c0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
241d0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
241e0 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
241f0 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
24200 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
24210 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
24220 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
24230 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
24240 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
24250 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24260 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
24270 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
24280 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
24290 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65       if( !pUnuse
242a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
242b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
242c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
242d0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d      p->pUnused =
242e0 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73   pUnused;.  }els
242f0 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a  e if( !zName ){.
24300 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
24310 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70  is NULL, the upp
24320 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75  er layer is requ
24330 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69  esting a temp fi
24340 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
24350 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
24360 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b  sOpenDirectory);
24370 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
24380 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
24390 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61  THNAME+1, zTmpna
243a0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
243b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
243c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
243d0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
243e0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
243f0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
24400 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
24410 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
24420 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20  passed to POSIX 
24430 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70  function.  ** op
24440 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74  en(). These must
24450 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65   be calculated e
24460 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73  ven if open() is
24470 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a   not called, as.
24480 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65    ** they may be
24490 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
244a0 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
244b0 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74  le and used by t
244c0 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20  he .  ** 'conch 
244d0 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75  file' locking fu
244e0 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e  nctions later on
244f0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65  .  */.  if( isRe
24500 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c  adonly )  openFl
24510 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
24520 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
24530 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  te ) openFlags |
24540 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20  = O_RDWR;.  if( 
24550 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70  isCreate )    op
24560 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45  enFlags |= O_CRE
24570 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
24580 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67  usive ) openFlag
24590 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
245a0 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e  OFOLLOW);.  open
245b0 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47  Flags |= (O_LARG
245c0 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
245d0 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ..  if( fd<0 ){.
245e0 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d      mode_t openM
245f0 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74 65 3f  ode = (isDelete?
24600 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46 41  0600:SQLITE_DEFA
24610 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
24620 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20 3d 20  IONS);.    fd = 
24630 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
24640 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
24650 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
24660 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
24670 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
24680 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
24690 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
246a0 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
246b0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
246c0 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
246d0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
246e0 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
246f0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
24700 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
24710 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
24720 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
24730 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24740 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
24750 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
24760 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
24770 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
24780 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
24790 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
247a0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
247b0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
247c0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e      fd = open(zN
247d0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
247e0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
247f0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
24800 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24810 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
24820 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
24830 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
24840 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
24850 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
24860 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
24870 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
24880 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
24890 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
248a0 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
248b0 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
248c0 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
248d0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
248e0 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
248f0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
24900 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
24910 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  lse.    unlink(z
24920 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
24930 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
24940 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24950 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
24960 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
24970 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
24980 69 66 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  if..  if( isOpen
24990 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
249a0 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
249b0 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66  ory(zPath, &dirf
249c0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
249d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
249e0 20 20 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65     /* It is safe
249f0 20 74 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20   to close fd at 
24a00 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61  this point, beca
24a10 75 73 65 20 69 74 20 69 73 20 67 75 61 72 61 6e  use it is guaran
24a20 74 65 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a  teed not.      *
24a30 2a 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20  * to be open on 
24a40 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
24a50 20 49 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e   If it were open
24a60 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
24a70 69 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ile,.      ** it
24a80 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61   would not be sa
24a90 66 65 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74  fe to close as t
24aa0 68 69 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73  his would releas
24ab0 65 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64  e any locks held
24ac0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
24ad0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 70 72   file by this pr
24ae0 6f 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ocess.  */.     
24af0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
24b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
24b10 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  _DB );.      clo
24b20 73 65 28 66 64 29 3b 20 20 20 20 20 20 20 20 20  se(fd);         
24b30 20 20 20 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20      /* silently 
24b40 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
24b50 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
24b60 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  /.      goto ope
24b70 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
24b80 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44  }.  }..#ifdef FD
24b90 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
24ba0 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
24bb0 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
24bc0 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
24bd0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c  );.#endif..  noL
24be0 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
24bf0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
24c00 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ;..  .#if define
24c10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
24c20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
24c30 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
24c40 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
24c50 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61 74 66  fo;.  if( fstatf
24c60 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
24c70 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
24c80 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
24c90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
24ca0 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  o;.    if( dirfd
24cb0 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
24cc0 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
24cd0 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
24ce0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c   error */.    cl
24cf0 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
24d00 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
24d10 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
24d20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24d30 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
24d40 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
24d50 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
24d60 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
24d70 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
24d80 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
24d90 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
24da0 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
24db0 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
24dc0 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .  .#if SQLITE_E
24dd0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24de0 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
24df0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
24e00 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
24e10 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
24e20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
24e30 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
24e40 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
24e50 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
24e60 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
24e70 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
24e80 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
24e90 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
24ea0 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
24eb0 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
24ec0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
24ed0 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
24ee0 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
24ef0 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
24f00 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
24f10 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
24f20 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
24f30 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
24f40 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
24f50 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
24f60 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
24f70 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
24f80 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
24f90 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
24fa0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
24fb0 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
24fc0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
24fd0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
24fe0 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
24ff0 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
25000 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
25010 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
25020 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
25030 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
25040 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
25050 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
25060 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
25070 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
25080 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
25090 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
250a0 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
250b0 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
250c0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
250d0 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
250e0 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
250f0 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
25100 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
25110 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
25120 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
25130 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
25140 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
25150 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
25160 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
25170 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
25180 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
25190 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
251a0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
251b0 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
251c0 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
251d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
251e0 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e        if( dirfd>
251f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25200 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
25210 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
25220 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
25230 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
25240 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
25250 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
25260 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
25270 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ror */.        r
25280 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
25290 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
252a0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
252b0 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
252c0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
252d0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
252e0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
252f0 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
25300 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
25310 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
25320 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
25330 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
25340 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
25350 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25370 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
25380 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
25390 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
253a0 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
253b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
253c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
253d0 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
253e0 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
253f0 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
25400 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
25410 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
25420 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
25430 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
25440 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
25450 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
25460 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
25470 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
25480 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
25490 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
254a0 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
254b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
254c0 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
254d0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
254e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
254f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25500 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
25510 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
25520 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
25530 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
25540 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
25550 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
25560 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
25570 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
25580 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
255a0 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
255b0 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
255c0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
255d0 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
255e0 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
255f0 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
25600 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
25610 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
25620 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
25630 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
25640 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25650 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
25660 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
25670 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
25680 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
25690 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
256a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
256b0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
256c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
256d0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
256e0 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25700 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
25710 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
25720 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
25730 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
25740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
25750 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
25760 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
25770 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
25780 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
25790 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
257a0 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20  zPath);.#ifndef 
257b0 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
257c0 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
257d0 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
257e0 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
257f0 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
25800 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
25810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25820 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
25830 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
25840 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
25850 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
25860 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
25870 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
25880 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
25890 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
258a0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  }.      if( clos
258b0 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
258c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
258d0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
258e0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
258f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
25900 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25910 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
25920 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
25930 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
25940 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
25950 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
25960 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
25970 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
25980 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
25990 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
259a0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
259b0 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
259c0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
259d0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
259e0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
259f0 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
25a00 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
25a10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
25a20 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
25a30 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
25a40 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
25a50 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
25a60 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
25a70 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
25a80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
25a90 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
25aa0 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
25ab0 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
25ac0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
25ad0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
25ae0 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
25af0 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
25b00 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
25b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
25b20 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
25b30 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
25b40 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
25b50 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
25b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
25b70 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
25b80 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
25b90 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
25ba0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
25bb0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
25bc0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
25bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25be0 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
25bf0 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
25c00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
25c10 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
25c20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
25c30 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
25c40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
25c50 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
25c60 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
25c70 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
25c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
25c90 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
25ca0 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
25cb0 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
25cc0 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
25cd0 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
25ce0 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
25cf0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
25d00 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61  .  *pResOut = (a
25d10 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
25d20 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72  de)==0);.  retur
25d30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25d40 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
25d50 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
25d60 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
25d70 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
25d80 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
25d90 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
25da0 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
25db0 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
25dc0 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
25dd0 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
25de0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
25df0 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
25e00 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
25e10 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
25e20 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
25e30 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
25e40 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
25e50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
25e60 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
25e70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
25e80 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
25e90 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
25ea0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
25eb0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
25ec0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
25ed0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
25ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
25ef0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
25f00 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
25f10 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
25f20 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
25f50 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
25f60 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
25f70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
25f80 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
25f90 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
25fa0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
25fb0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
25fc0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
25fd0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
25fe0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
25ff0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
26000 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
26010 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
26020 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
26030 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
26040 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
26050 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
26060 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
26070 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
26080 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
26090 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
260a0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
260b0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
260c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
260d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
260e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
260f0 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
26100 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26110 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
26120 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
26130 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
26140 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
26150 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
26160 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
26170 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
26180 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
26190 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
261a0 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
261b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
261c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
261d0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  T;.    }.    nCw
261e0 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
261f0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
26200 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
26210 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
26220 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
26230 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
26250 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26260 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
26270 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
26280 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
26290 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
262a0 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
262b0 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
262c0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
262d0 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
262e0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
262f0 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
26300 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
26310 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
26320 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
26330 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
26340 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
26350 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26360 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
26370 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
26380 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
26390 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
263a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
263b0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
263c0 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
263d0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
263e0 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
263f0 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
26400 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
26410 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
26420 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
26430 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
26440 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
26450 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
26460 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
26470 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
26480 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
26490 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
264a0 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
264b0 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
264c0 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
264d0 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
264e0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
264f0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
26500 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
26510 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
26520 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
26530 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
26540 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
26550 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
26560 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
26570 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
26580 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
26590 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
265a0 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
265b0 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
265c0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
265d0 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
265e0 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
265f0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
26600 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
26610 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
26620 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
26630 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
26640 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
26650 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
26660 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
26670 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
26680 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
26690 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
266a0 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
266b0 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
266c0 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
266d0 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
266e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
266f0 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
26700 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
26710 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
26720 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
26730 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
26740 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
26750 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
26760 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
26770 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
26780 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
26790 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
267a0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
267b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
267c0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
267d0 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
267e0 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
267f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
26800 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
26810 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
26820 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
26830 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
26840 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
26850 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
26860 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
26870 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
26880 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
26890 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
268a0 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
268b0 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
268c0 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
268d0 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
268e0 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
268f0 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
26900 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
26910 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
26920 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
26930 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
26940 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
26950 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
26960 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
26970 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
26980 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
26990 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
269a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
269b0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
269c0 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
269d0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
269e0 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
269f0 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
26a00 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
26a10 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
26a20 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
26a30 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
26a40 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
26a50 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
26a60 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
26a70 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
26a80 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
26a90 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
26aa0 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
26ab0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
26ac0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
26ad0 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
26ae0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
26af0 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
26b00 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
26b10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
26b20 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
26b30 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
26b40 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
26b50 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
26b60 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
26b70 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
26b80 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
26b90 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
26ba0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
26bb0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
26bc0 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
26bd0 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
26be0 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
26bf0 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
26c00 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
26c10 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
26c20 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
26c30 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
26c40 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
26c50 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
26c60 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
26c70 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
26c80 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
26c90 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
26ca0 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
26cb0 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
26cc0 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
26cd0 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
26ce0 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
26cf0 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
26d00 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
26d10 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
26d20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
26d30 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
26d40 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
26d50 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
26d60 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
26d70 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
26d80 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
26d90 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
26da0 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
26db0 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
26dc0 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
26dd0 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
26de0 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
26df0 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
26e00 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
26e10 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
26e20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
26e30 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
26e40 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
26e50 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
26e60 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
26e70 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
26e80 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
26e90 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
26ea0 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
26eb0 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
26ec0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
26ed0 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
26ee0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
26ef0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
26f00 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
26f10 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
26f20 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
26f30 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
26f40 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
26f50 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
26f60 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
26f70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
26f80 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
26f90 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
26fa0 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
26fb0 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
26fc0 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
26fd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26fe0 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64    nBuf = read(fd
26ff0 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
27000 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
27010 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
27020 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
27030 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
27040 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
27050 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
27060 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
27070 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
27080 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
27090 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
270a0 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
270b0 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
270c0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
270d0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
270e0 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
270f0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
27100 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
27110 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
27120 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
27130 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
27140 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
27150 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
27160 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
27170 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
27180 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
27190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
271a0 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
271b0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
271c0 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
271d0 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
271e0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
271f0 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
27200 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
27210 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
27220 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
27230 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
27240 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
27250 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
27260 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
27270 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
27280 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
27290 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
272a0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
272b0 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
272c0 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
272d0 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
272e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
272f0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
27300 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
27310 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
27320 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
27330 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
27340 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
27350 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
27360 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
27370 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
27380 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
27390 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
273a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
273b0 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
273c0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
273d0 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
273e0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
273f0 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
27400 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
27410 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
27420 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
27430 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
27440 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
27450 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
27460 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
27470 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
27480 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
27490 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
274a0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
274b0 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
274c0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
274d0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
274e0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
274f0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
27500 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
27510 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
27520 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
27530 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
27540 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
27550 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
27560 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
27570 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
27580 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
27590 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
275a0 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
275b0 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
275c0 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
275d0 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
275e0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
275f0 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
27600 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
27610 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
27620 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  , return 0.  Ret
27630 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
27640 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
27650 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
27660 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
27670 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
27680 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
27690 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
276a0 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
276b0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
276c0 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
276d0 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
276e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
276f0 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65  0000;.#if define
27700 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
27710 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
27720 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
27730 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
27740 69 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  i)*1000 + unixEp
27750 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
27760 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
27770 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
27780 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
27790 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
277a0 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
277b0 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
277c0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
277d0 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
277e0 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
277f0 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
27800 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
27810 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
27820 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70  (&sNow, 0);.  *p
27830 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
27840 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
27850 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
27860 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  ec + sNow.tv_use
27870 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a  c/1000;.#endif..
27880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
27890 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
278a0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
278b0 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
278c0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
278d0 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
278e0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
278f0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
27900 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27910 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
27920 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
27930 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
27940 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
27950 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
27960 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
27970 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
27980 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
27990 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
279a0 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
279b0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
279c0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
279d0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
279e0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
279f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27a00 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
27a10 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
27a20 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
27a30 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
27a40 74 36 34 20 69 3b 0a 20 20 75 6e 69 78 43 75 72  t64 i;.  unixCur
27a50 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
27a60 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
27a70 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
27a80 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
27a90 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
27aa0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
27ab0 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
27ac0 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
27ad0 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
27ae0 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
27af0 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
27b00 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
27b10 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
27b20 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
27b30 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
27b40 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
27b50 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
27b60 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
27b70 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
27b80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
27b90 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
27ba0 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
27bb0 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
27bc0 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
27bd0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
27be0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
27bf0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
27c00 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
27c10 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
27c20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27c30 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
27c40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
27c50 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
27c60 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
27c70 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
27c80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
27c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ca0 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
27cb0 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
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 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
27ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d20 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
27d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
27d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d90 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
27da0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
27db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
27dd0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
27de0 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
27df0 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
27e00 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
27e10 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
27e20 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
27e30 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
27e40 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
27e50 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
27e60 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
27e70 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
27e80 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
27e90 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
27ea0 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
27eb0 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
27ec0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
27ed0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
27ee0 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
27ef0 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
27f00 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
27f10 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
27f20 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
27f30 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
27f40 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
27f50 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
27f60 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
27f70 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
27f80 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
27f90 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
27fa0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
27fb0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
27fc0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
27fd0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
27fe0 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
27ff0 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
28000 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
28010 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
28020 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
28030 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
28040 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
28050 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
28060 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
28070 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
28080 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
28090 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
280a0 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
280b0 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
280c0 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
280d0 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
280e0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
280f0 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
28100 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
28110 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
28120 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
28130 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
28140 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
28150 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
28160 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
28170 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
28180 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
28190 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
281a0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
281b0 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
281c0 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
281d0 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
281e0 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
281f0 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
28200 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
28210 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
28220 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
28230 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
28240 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
28250 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
28260 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
28270 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
28280 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
28290 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
282a0 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
282b0 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20  0000..   ..**   
282c0 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
282d0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
282e0 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
282f0 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
28300 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
28310 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
28320 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
28330 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
28340 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
28350 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
28360 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
28370 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
28380 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
28390 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
283a0 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
283b0 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
283c0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
283d0 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
283e0 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
283f0 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
28400 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
28410 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
28420 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
28430 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
28440 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
28450 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
28460 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
28470 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
28480 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
28490 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
284a0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
284b0 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
284c0 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
284d0 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
284e0 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
284f0 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
28500 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
28510 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
28520 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
28530 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
28540 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
28550 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
28560 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
28570 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
28580 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
28590 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
285a0 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
285b0 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
285c0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
285d0 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
285e0 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
285f0 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
28600 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
28610 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
28620 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
28630 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
28640 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
28650 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
28660 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
28670 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
28680 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
28690 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
286a0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
286b0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
286c0 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
286d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
286e0 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
286f0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
28700 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
28710 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ame, SQLITE_SET_
28720 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
28730 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
28740 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
28750 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
28760 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
28770 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
28780 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45  bname, SQLITE_GE
28790 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
287a0 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
287b0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
287c0 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
287d0 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
287e0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
287f0 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
28800 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
28810 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
28820 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
28830 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
28840 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
28850 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
28860 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
28870 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
28880 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
28890 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
288a0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
288b0 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
288c0 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
288d0 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
288e0 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
288f0 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
28900 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
28910 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
28920 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
28930 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
28940 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
28950 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
28960 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
28970 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
28980 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
28990 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
289a0 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
289b0 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
289c0 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
289d0 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
289e0 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
289f0 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
28a00 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
28a10 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
28a20 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
28a30 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
28a40 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
28a50 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
28a60 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
28a70 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
28a80 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
28a90 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
28aa0 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
28ab0 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
28ac0 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
28ad0 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
28ae0 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
28af0 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
28b00 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
28b10 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
28b20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
28b30 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
28b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
28b50 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
28b60 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
28b70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
28b80 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
28b90 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
28ba0 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
28bb0 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
28bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28bd0 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
28be0 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
28bf0 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
28c00 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
28c10 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
28c20 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
28c30 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
28c40 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
28c50 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
28c60 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
28c70 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
28c80 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
28c90 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
28ca0 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
28cb0 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
28cc0 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
28cd0 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
28ce0 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
28cf0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
28d00 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
28d10 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
28d20 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
28d30 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
28d40 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
28d50 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
28d60 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
28d70 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
28d80 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
28d90 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
28da0 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
28db0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
28dc0 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
28dd0 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
28de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28df0 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
28e00 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
28e10 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
28e20 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
28e30 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73  t exist, or it's
28e40 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
28e50 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
28e60 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
28e70 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
28e80 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
28e90 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
28ea0 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
28eb0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
28ec0 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
28ed0 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
28ee0 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
28ef0 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
28f00 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
28f10 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
28f20 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
28f30 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
28f40 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
28f50 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
28f60 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
28f70 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
28f80 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
28f90 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
28fa0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
28fb0 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
28fc0 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
28fd0 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
28fe0 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
28ff0 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
29000 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
29010 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
29020 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
29030 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
29040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29050 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
29060 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
29070 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
29080 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
29090 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
290a0 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
290b0 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
290c0 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
290d0 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
290e0 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
290f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
29100 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
29110 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
29120 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
29130 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
29140 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
29150 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
29160 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
29170 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
29180 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
29190 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
291a0 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
291b0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
291c0 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
291d0 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
291e0 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
291f0 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
29200 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
29210 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
29220 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
29230 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
29240 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
29250 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
29260 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
29270 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
29280 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
29290 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
292a0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
292b0 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
292c0 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
292d0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
292e0 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
292f0 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
29300 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
29310 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
29320 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
29330 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
29340 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
29350 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
29360 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
29370 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
29380 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
29390 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
293a0 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
293b0 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
293c0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
293d0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
293e0 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
293f0 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
29400 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
29410 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
29420 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
29430 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
29440 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
29450 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
29460 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
29470 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
29480 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
29490 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
294a0 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
294b0 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
294c0 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
294d0 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
294e0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
294f0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
29500 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
29510 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
29520 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
29530 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
29540 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
29550 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
29560 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
29570 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
29580 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
29590 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
295a0 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
295b0 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
295c0 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
295d0 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
295e0 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
295f0 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
29600 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
29610 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
29620 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
29630 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
29640 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
29650 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
29660 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
29670 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
29680 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
29690 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
296a0 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
296b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
296c0 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
296d0 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
296e0 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
296f0 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
29700 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
29710 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
29720 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  city calling the
29730 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
29740 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
29750 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
29760 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
29770 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
29780 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
29790 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
297a0 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
297b0 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
297c0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
297d0 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
297e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
297f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29800 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
29810 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63  .** The proxyLoc
29820 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20  kingContext has 
29830 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c  the path and fil
29840 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
29850 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20   the remote .** 
29860 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  and local proxy 
29870 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74  files in it.*/.t
29880 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72  ypedef struct pr
29890 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
298a0 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
298b0 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72  ntext;.struct pr
298c0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
298d0 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t {.  unixFile *
298e0 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
298f0 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68     /* Open conch
29900 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
29910 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20  *conchFilePath; 
29920 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
29930 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
29940 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
29950 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20  *lockProxy;     
29960 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78      /* Open prox
29970 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
29980 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79   char *lockProxy
29990 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
299a0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
299b0 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
299c0 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20    char *dbPath; 
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
299e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
299f0 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  en file */.  int
29a00 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20   conchHeld;     
29a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69            /* 1 i
29a20 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68  f the conch is h
29a30 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c  eld, -1 if lockl
29a40 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  ess */.  void *o
29a50 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
29a60 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
29a70 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
29a80 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
29a90 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
29aa0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
29ab0 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
29ac0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
29ad0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
29ae0 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
29af0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
29b00 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
29b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
29b20 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
29b30 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
29b40 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
29b50 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
29b60 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
29b70 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
29b80 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
29b90 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
29ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
29bb0 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
29bc0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
29bd0 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
29be0 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
29bf0 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
29c00 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
29c10 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
29c20 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
29c30 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
29c40 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
29c50 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
29c60 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
29c70 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
29c80 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
29c90 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
29ca0 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
29cb0 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
29cc0 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
29cd0 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
29ce0 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
29cf0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
29d00 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
29d10 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
29d20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29d30 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
29d40 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
29d50 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
29d60 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
29d70 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
29d80 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
29d90 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
29da0 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
29db0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
29dc0 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
29dd0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
29de0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
29df0 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
29e00 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
29e10 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
29e20 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
29e30 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
29e40 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
29e50 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
29e60 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
29e70 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c  & (i+len+7)<maxL
29e80 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  en; i++){.    ch
29e90 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d  ar c = dbPath[i]
29ea0 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65  ;.    lPath[i+le
29eb0 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f  n] = (c=='/')?'_
29ec0 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68  ':c;.  }.  lPath
29ed0 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20  [i+len]='\0';.  
29ee0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
29ef0 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29  :auto:", maxLen)
29f00 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45  ;.  OSTRACE(("GE
29f10 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  TLOCKPATH  proxy
29f20 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
29f30 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20  d=%d\n", lPath, 
29f40 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65  getpid()));.  re
29f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29f60 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74  }../* . ** Creat
29f70 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  es the lock file
29f80 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67   and any missing
29f90 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20   directories in 
29fa0 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61  lockPath. */.sta
29fb0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
29fc0 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  ateLockPath(cons
29fd0 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68  t char *lockPath
29fe0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b  ){.  int i, len;
29ff0 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50  .  char buf[MAXP
2a000 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73  ATHLEN];.  int s
2a010 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61  tart = 0;.  .  a
2a020 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d  ssert(lockPath!=
2a030 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20  NULL);.  /* try 
2a040 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68  to create all th
2a050 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64  e intermediate d
2a060 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20  irectories */.  
2a070 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
2a080 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62  n(lockPath);.  b
2a090 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[0] = lockPath
2a0a0 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b  [0];.  for( i=1;
2a0b0 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20   i<len; i++ ){. 
2a0c0 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b     if( lockPath[
2a0d0 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20  i] == '/' && (i 
2a0e0 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a  - start > 0) ){.
2a0f0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b        /* only mk
2a100 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20  dir if leaf dir 
2a110 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72  != "." or "/" or
2a120 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69   ".." */.      i
2a130 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20  f( i-start>2 || 
2a140 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62  (i-start==1 && b
2a150 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
2a160 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
2a170 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20  = '/') .        
2a180 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20   || (i-start==2 
2a190 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
2a1a0 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
2a1b0 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a  t+1] != '.') ){.
2a1c0 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27          buf[i]='
2a1d0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \0';.        if(
2a1e0 20 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49   mkdir(buf, SQLI
2a1f0 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
2a200 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
2a210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2a220 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
2a230 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
2a240 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
2a250 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
2a260 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
2a270 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
2a280 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
2a290 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
2a2a0 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
2a2b0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2d0 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
2a2e0 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
2a2f0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
2a300 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2a310 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
2a320 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a330 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
2a340 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
2a350 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
2a360 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
2a370 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
2a380 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
2a390 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2a3a0 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  n", lockPath, ge
2a3b0 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
2a3c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2a3d0 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
2a3e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2a3f0 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
2a400 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
2a410 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
2a420 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
2a430 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
2a440 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
2a450 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
2a460 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
2a470 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
2a480 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
2a490 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2a4a0 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
2a4b0 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
2a4c0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
2a4d0 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
2a4e0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
2a4f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
2a500 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
2a510 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
2a520 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
2a530 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
2a540 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
2a550 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
2a560 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
2a570 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
2a580 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
2a590 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
2a5a0 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
2a5b0 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
2a5c0 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
2a5d0 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
2a5e0 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
2a5f0 3b 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20  ;.  int dirfd = 
2a600 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  -1;.  unixFile *
2a610 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
2a620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2a630 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  t openFlags = O_
2a640 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
2a650 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75    sqlite3_vfs du
2a660 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65  mmyVfs;.  int te
2a670 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78  rrno = 0;.  Unix
2a680 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2a690 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  d = NULL;..  /* 
2a6a0 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  1. first try to 
2a6b0 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
2a6c0 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20  file.  ** 2. if 
2a6d0 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20  that fails, and 
2a6e0 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66  this is a lock f
2a6f0 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c  ile (not-conch),
2a700 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20   try creating.  
2a710 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  ** the parent di
2a720 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68  rectories and th
2a730 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20  en try again..  
2a740 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61  ** 3. if that fa
2a750 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e  ils, try to open
2a760 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f   the file read-o
2a770 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69  nly.  ** otherwi
2a780 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28  se return BUSY (
2a790 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72  if lock file) or
2a7a0 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68   CANTOPEN for th
2a7b0 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a  e conch file.  *
2a7c0 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69  /.  pUnused = fi
2a7d0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74  ndReusableFd(pat
2a7e0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20  h, openFlags);. 
2a7f0 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2a800 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
2a810 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->fd;.  }else{. 
2a820 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
2a830 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
2a840 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
2a850 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
2a860 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a870 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a880 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
2a890 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 6f  <0 ){.    fd = o
2a8a0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2a8b0 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2a8c0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2a8d0 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e  IONS);.    terrn
2a8e0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
2a8f0 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
2a900 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f  ==ENOENT && islo
2a910 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
2a920 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c  if( proxyCreateL
2a930 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d  ockPath(path) ==
2a940 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20   SQLITE_OK ){.  
2a950 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28        fd = open(
2a960 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
2a970 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2a980 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2a990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a9a0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2a9b0 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
2a9c0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
2a9d0 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c   fd = open(path,
2a9e0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
2a9f0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2aa00 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2aa10 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
2aa20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
2aa30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f   ){.    if( islo
2aa40 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
2aa50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2aa60 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  SY;.    }.    sw
2aa70 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a  itch (terrno) {.
2aa80 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45        case EACCE
2aa90 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  S:.        retur
2aaa0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
2aab0 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a       case EIO: .
2aac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2aad0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
2aae0 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ; /* even though
2aaf0 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68   it is the conch
2ab00 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c   */.      defaul
2ab10 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  t:.        retur
2ab20 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
2ab30 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2ab40 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75  }.  .  pNew = (u
2ab50 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65  nixFile *)sqlite
2ab60 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2ab70 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
2ab80 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
2ab90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2aba0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  EM;.    goto end
2abb0 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20  _create_proxy;. 
2abc0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
2abd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2abe0 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  File));.  pNew->
2abf0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
2ac00 46 6c 61 67 73 3b 0a 20 20 64 75 6d 6d 79 56 66  Flags;.  dummyVf
2ac10 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
2ac20 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
2ac30 69 6e 64 65 72 3b 0a 20 20 70 55 6e 75 73 65 64  inder;.  pUnused
2ac40 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
2ac50 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
2ac60 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
2ac70 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
2ac80 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ed;.  .  rc = fi
2ac90 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75  llInUnixFile(&du
2aca0 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66  mmyVfs, fd, dirf
2acb0 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
2acc0 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c  *)pNew, path, 0,
2acd0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
2ace0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2acf0 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a  *ppFile = pNew;.
2ad00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ad10 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72  E_OK;.  }.end_cr
2ad20 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a  eate_proxy:    .
2ad30 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
2ad40 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64  silently leak fd
2ad50 20 69 66 20 65 72 72 6f 72 2c 20 77 65 27 72 65   if error, we're
2ad60 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72 6f   already in erro
2ad70 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
2ad80 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c  ree(pNew);.  sql
2ad90 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65  ite3_free(pUnuse
2ada0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
2adb0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2adc0 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61  E_TEST./* simula
2add0 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
2ade0 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
2adf0 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
2ae00 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71   paths */.int sq
2ae10 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2ae20 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64   = 0;.#endif..#d
2ae30 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54  efine PROXY_HOST
2ae40 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20  IDLEN    16  /* 
2ae50 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20  conch file host 
2ae60 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a  id length */../*
2ae70 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
2ae80 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
2ae90 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
2aea0 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
2aeb0 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
2aec0 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
2aed0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
2aee0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
2aef0 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
2af00 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
2af10 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73 74 72   *pError){.  str
2af20 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
2af30 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
2af40 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
2af50 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 50  */.  .  assert(P
2af60 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
2af70 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
2af80 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
2af90 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
2afa0 53 54 49 44 4c 45 4e 29 3b 0a 20 20 69 66 28 20  STIDLEN);.  if( 
2afb0 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73  gethostuuid(pHos
2afc0 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29  tID, &timeout) )
2afd0 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20  {.    int err = 
2afe0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70  errno;.    if( p
2aff0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
2b000 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
2b010 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
2b020 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
2b030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2b040 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74  EST.  /* simulat
2b050 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
2b060 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
2b070 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
2b080 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73  paths */.  if( s
2b090 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2b0a0 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f  m != 0){.    pHo
2b0b0 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29  stID[0] = (char)
2b0c0 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63  (pHostID[0] + (c
2b0d0 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73  har)(sqlite3_hos
2b0e0 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29  tid_num & 0xFF))
2b0f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2b100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b110 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  OK;.}../* The co
2b120 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nch file contain
2b130 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f  s the header, ho
2b140 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66  st id and lock f
2b150 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65  ile path. */.#de
2b160 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48  fine PROXY_CONCH
2b170 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31  VERSION 2   /* 1
2b180 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36  -byte header, 16
2b190 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70  -byte host id, p
2b1a0 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ath */.#define P
2b1b0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20  ROXY_HEADERLEN  
2b1c0 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66    1   /* conch f
2b1d0 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74  ile header lengt
2b1e0 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
2b1f0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20  XY_PATHINDEX    
2b200 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
2b210 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
2b220 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ).#define PROXY_
2b230 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52  MAXCONCHLEN  (PR
2b240 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
2b250 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41  OXY_HOSTIDLEN+MA
2b260 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a  XPATHLEN)../* .*
2b270 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20  * Takes an open 
2b280 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69  conch file, copi
2b290 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
2b2a0 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e  to a new path an
2b2b0 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a  d then moves .**
2b2c0 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e   it back.  The n
2b2d0 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c  ewly created fil
2b2e0 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  e's file descrip
2b2f0 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20  tor is assigned 
2b300 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20  to the.** conch 
2b310 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  file structure a
2b320 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f  nd finally the o
2b330 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69  riginal conch fi
2b340 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2b350 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65   .** closed.  Re
2b360 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75  turns zero if su
2b370 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61  ccessful..*/.sta
2b380 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65  tic int proxyBre
2b390 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  akConchLock(unix
2b3a0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
2b3b0 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20  d_t myHostID){. 
2b3c0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2b3d0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
2b3e0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2b3f0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
2b400 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
2b410 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2b420 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
2b430 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74  ile;.  char tPat
2b440 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
2b450 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f   char buf[PROXY_
2b460 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
2b470 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43  char *cPath = pC
2b480 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2b490 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64  h;.  size_t read
2b4a0 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f  Len = 0;.  size_
2b4b0 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20  t pathLen = 0;. 
2b4c0 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d   char errmsg[64]
2b4d0 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20   = "";.  int fd 
2b4e0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  = -1;.  int rc =
2b4f0 20 2d 31 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74   -1;..  /* creat
2b500 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20  e a new path by 
2b510 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69  replace the trai
2b520 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69  ling '-conch' wi
2b530 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20  th '-break' */. 
2b540 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63   pathLen = strlc
2b550 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c  py(tPath, cPath,
2b560 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2b570 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50  if( pathLen>MAXP
2b580 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65  ATHLEN || pathLe
2b590 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74  n<6 || .     (st
2b5a0 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74  rlcpy(&tPath[pat
2b5b0 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22  hLen-5], "break"
2b5c0 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20  , 6) != 5) ){.  
2b5d0 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
2b5e0 2c 20 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c  , "path error (l
2b5f0 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 70 61  en %d)", (int)pa
2b600 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  thLen);.    goto
2b610 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2b620 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68    }.  /* read th
2b630 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20  e conch content 
2b640 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70  */.  readLen = p
2b650 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
2b660 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
2b670 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
2b680 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
2b690 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
2b6a0 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d      sprintf(errm
2b6b0 73 67 2c 20 22 72 65 61 64 20 65 72 72 6f 72 20  sg, "read error 
2b6c0 28 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29  (len %d)", (int)
2b6d0 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
2b6e0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
2b6f0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
2b700 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
2b710 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
2b720 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70  ile */.  fd = op
2b730 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57  en(tPath, (O_RDW
2b740 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c  R|O_CREAT|O_EXCL
2b750 29 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ), SQLITE_DEFAUL
2b760 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
2b770 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  NS);.  if( fd<0 
2b780 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65  ){.    sprintf(e
2b790 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
2b7a0 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
2b7b0 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
2b7c0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2b7d0 0a 20 20 69 66 28 20 70 77 72 69 74 65 28 66 64  .  if( pwrite(fd
2b7e0 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20  , buf, readLen, 
2b7f0 30 29 20 21 3d 20 72 65 61 64 4c 65 6e 20 29 7b  0) != readLen ){
2b800 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72  .    sprintf(err
2b810 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c  msg, "write fail
2b820 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
2b830 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2b840 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2b850 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68  if( rename(tPath
2b860 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20  , cPath) ){.    
2b870 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20  sprintf(errmsg, 
2b880 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
2b890 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
2b8a0 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
2b8b0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
2b8c0 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
2b8d0 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
2b8e0 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
2b8f0 2c 20 63 50 61 74 68 29 3b 0a 20 20 63 6c 6f 73  , cPath);.  clos
2b900 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b  e(conchFile->h);
2b910 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20  .  conchFile->h 
2b920 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  = fd;.  conchFil
2b930 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  e->openFlags = O
2b940 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
2b950 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a  ..end_breaklock:
2b960 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2b970 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
2b980 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68      unlink(tPath
2b990 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  );.      close(f
2b9a0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  d);.    }.    fp
2b9b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
2b9c0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
2b9d0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
2b9e0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
2b9f0 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
2ba00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
2ba10 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
2ba20 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
2ba30 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
2ba40 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
2ba50 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
2ba60 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
2ba70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2ba80 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
2ba90 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
2baa0 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
2bab0 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
2bac0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2bad0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
2bae0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2baf0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2bb00 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
2bb10 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
2bb20 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
2bb30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2bb40 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
2bb50 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
2bb60 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
2bb70 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20  odTime;.  .  do 
2bb80 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
2bb90 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2bba0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2bbb0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
2bbc0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54  ockType);.    nT
2bbd0 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28  ries ++;.    if(
2bbe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
2bbf0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2bc00 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20  the lock failed 
2bc10 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a  (busy):.       *
2bc20 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68   1st try: get th
2bc30 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68  e mod time of th
2bc40 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e  e conch, wait 0.
2bc50 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  5s and try again
2bc60 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20  . .       * 2nd 
2bc70 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65  try: fail if the
2bc80 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65   mod time change
2bc90 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20  d or host id is 
2bca0 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20  different, wait 
2bcb0 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20  .       *       
2bcc0 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74      10 sec and t
2bcd0 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20  ry again.       
2bce0 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b  * 3rd try: break
2bcf0 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73   the lock unless
2bd00 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61   the mod time ha
2bd10 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  s changed..     
2bd20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63    */.      struc
2bd30 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
2bd40 20 20 69 66 28 20 66 73 74 61 74 28 63 6f 6e 63    if( fstat(conc
2bd50 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
2bd60 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
2bd70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2bd80 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
2bd90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2bda0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
2bdb0 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
2bdc0 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20  nTries==1 ){.   
2bdd0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
2bde0 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65  e = buf.st_mtime
2bdf0 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73  spec;.        us
2be00 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a  leep(500000); /*
2be10 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e   wait 0.5 sec an
2be20 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
2be30 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63  gain*/.        c
2be40 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
2be50 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2be60 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20  ( nTries>1 );.  
2be70 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64      if( conchMod
2be80 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62  Time.tv_sec != b
2be90 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
2bea0 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20  tv_sec || .     
2beb0 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
2bec0 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e  .tv_nsec != buf.
2bed0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
2bee0 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nsec ){.        
2bef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2bf00 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SY;.      }.    
2bf10 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
2bf20 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20  ies==2 ){  .    
2bf30 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52      char tBuf[PR
2bf40 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
2bf50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  ;.        int le
2bf60 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68 46  n = pread(conchF
2bf70 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52  ile->h, tBuf, PR
2bf80 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
2bf90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2bfa0 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
2bfb0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
2bfc0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2bfd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2bfe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
2bff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c000 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58      if( len>PROX
2c010 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74  Y_PATHINDEX && t
2c020 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52  Buf[0]==(char)PR
2c030 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
2c040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2c050 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
2c060 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74  lock if the host
2c070 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   id doesn't matc
2c080 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  h */.          i
2c090 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42  f( 0!=memcmp(&tB
2c0a0 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
2c0b0 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
2c0c0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
2c0d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2c0e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2c0f0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
2c100 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c110 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
2c120 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
2c130 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72  on short read or
2c140 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61   a version misma
2c150 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
2c160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2c170 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  USY;.        }. 
2c180 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30         usleep(10
2c190 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  000000); /* wait
2c1a0 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
2c1b0 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a  the lock again *
2c1c0 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
2c1d0 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue; .      }.   
2c1e0 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74     .      assert
2c1f0 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20  ( nTries==3 );. 
2c200 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78       if( 0==prox
2c210 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
2c220 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29  pFile, myHostID)
2c230 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c250 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
2c260 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
2c270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2c280 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2c290 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2c2a0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2c2b0 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
2c2c0 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20  CK);          . 
2c2d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c2e0 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
2c2f0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
2c300 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2c310 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2c320 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
2c330 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ockType);.      
2c340 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c350 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d  }.  } while( rc=
2c360 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
2c370 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20  nTries<3 );.  . 
2c380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c390 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63  * Takes the conc
2c3a0 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68  h by taking a sh
2c3b0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65  ared lock and re
2c3c0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
2c3d0 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f  conch, if .** lo
2c3e0 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55  ckPath is non-NU
2c3f0 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20  LL, the host ID 
2c400 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
2c410 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20  th must match.  
2c420 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50  A NULL .** lockP
2c430 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ath means that t
2c440 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74  he lockPath in t
2c450 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
2c460 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ll be used if th
2c470 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d  e .** host IDs m
2c480 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c  atch, or a new l
2c490 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
2c4a0 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d   generated autom
2c4b0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64  atically .** and
2c4c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2c4d0 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73  conch file..*/.s
2c4e0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
2c4f0 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  akeConch(unixFil
2c500 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f  e *pFile){.  pro
2c510 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2c520 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
2c530 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
2c540 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
2c550 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28  ntext; .  .  if(
2c560 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2c570 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
2c580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2c590 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
2c5a0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
2c5b0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
2c5c0 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f  .    uuid_t myHo
2c5d0 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45  stID;.    int pE
2c5e0 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68  rror = 0;.    ch
2c5f0 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59  ar readBuf[PROXY
2c600 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2c610 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68     char lockPath
2c620 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
2c630 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b    char *tempLock
2c640 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Path = NULL;.   
2c650 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c660 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65  _OK;.    int cre
2c670 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20  ateConch = 0;.  
2c680 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63    int hostIdMatc
2c690 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  h = 0;.    int r
2c6a0 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  eadLen = 0;.    
2c6b0 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61  int tryOldLockPa
2c6c0 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  th = 0;.    int 
2c6d0 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
2c6e0 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f   = 0;.    .    O
2c6f0 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e  STRACE(("TAKECON
2c700 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
2c710 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
2c720 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
2c730 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
2c740 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
2c750 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
2c760 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
2c770 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20  id()));..    rc 
2c780 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  = proxyGetHostID
2c790 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72  (myHostID, &pErr
2c7a0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  or);.    if( (rc
2c7b0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
2c7c0 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46  OERR ){.      pF
2c7d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
2c7e0 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67   pError;.      g
2c7f0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2c800 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  h;.    }.    rc 
2c810 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
2c820 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
2c830 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2c840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2c860 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2c870 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  h;.    }.    /* 
2c880 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e  read the existin
2c890 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  g conch file */.
2c8a0 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65      readLen = se
2c8b0 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
2c8c0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2c8d0 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58  0, readBuf, PROX
2c8e0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a  Y_MAXCONCHLEN);.
2c8f0 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c      if( readLen<
2c900 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f  0 ){.      /* I/
2c910 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72  O error: lastErr
2c920 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
2c930 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70  dRead */.      p
2c940 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
2c950 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73  = conchFile->las
2c960 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
2c970 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2c980 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f  READ;.      goto
2c990 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
2c9a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
2c9b0 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45  adLen<=(PROXY_HE
2c9c0 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
2c9d0 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20  STIDLEN) || .   
2c9e0 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42 75            readBu
2c9f0 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58  f[0]!=(char)PROX
2ca00 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29  Y_CONCHVERSION )
2ca10 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f  {.      /* a sho
2ca20 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73 69  rt read or versi
2ca30 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74  on format mismat
2ca40 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  ch means we need
2ca50 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
2ca60 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68   .      ** conch
2ca70 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f   file. .      */
2ca80 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e  .      createCon
2ca90 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ch = 1;.    }.  
2caa0 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74    /* if the host
2cab0 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20   id matches and 
2cac0 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c  the lock path al
2cad0 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
2cae0 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a  the conch.    **
2caf0 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73   we'll try to us
2cb00 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72 65  e the path there
2cb10 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70  , if we can't op
2cb20 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77 65  en that path, we
2cb30 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72  'll .    ** retr
2cb40 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75 74  y with a new aut
2cb50 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74 68  o-generated path
2cb60 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20   .    */.    do 
2cb70 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  { /* in case we 
2cb80 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61 69  need to try agai
2cb90 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20  n for an :auto: 
2cba0 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20  named lock file 
2cbb0 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63  */..      if( !c
2cbc0 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66  reateConch && !f
2cbd0 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
2cbe0 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49  ){.        hostI
2cbf0 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70  dMatch = !memcmp
2cc00 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  (&readBuf[PROXY_
2cc10 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
2cc20 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20  stID, .         
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc40 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48           PROXY_H
2cc50 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
2cc60 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
2cc70 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70  ch has data comp
2cc80 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
2cc90 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2cca0 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
2ccb0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
2ccc0 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61    /* for auto-na
2ccd0 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  med local lock f
2cce0 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20  ile, just check 
2ccf0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
2cd00 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  we'll.          
2cd10 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61   ** use the loca
2cd20 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
2cd30 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20   that's already 
2cd40 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  in there.       
2cd50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2cd60 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
2cd70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cd80 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
2cd90 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58   (readLen - PROX
2cda0 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20  Y_PATHINDEX);.  
2cdb0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
2cdc0 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c         if( pathL
2cdd0 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  en>=MAXPATHLEN )
2cde0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cdf0 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c  pathLen=MAXPATHL
2ce00 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  EN-1;.          
2ce10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ce20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c  memcpy(lockPath,
2ce30 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
2ce40 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68  PATHINDEX], path
2ce50 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Len);.          
2ce60 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c    lockPath[pathL
2ce70 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  en] = 0;.       
2ce80 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
2ce90 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
2cea0 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
2ceb0 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
2cec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65            /* cre
2ced0 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
2cee0 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74  e lock path if t
2cef0 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
2cf00 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
2cf10 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
2cf20 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nch;.          }
2cf30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2cf40 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20  f( hostIdMatch. 
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2cf60 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
2cf70 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26  lockProxyPath, &
2cf80 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
2cf90 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20  THINDEX],.      
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f       readLen-PRO
2cfc0 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20  XY_PATHINDEX).  
2cfd0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2cfe0 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74     /* conch host
2cff0 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d   and lock path m
2d000 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
2d010 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
2d020 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d  onch; .        }
2d030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
2d040 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
2d050 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74  conch isn't writ
2d060 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74  able and doesn't
2d070 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74   match, we can't
2d080 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20   take it */.    
2d090 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65    if( (conchFile
2d0a0 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44  ->openFlags&O_RD
2d0b0 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  WR) == 0 ){.    
2d0c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d0d0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f  BUSY;.        go
2d0e0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
2d0f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d100 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72  .      /* either
2d110 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27   the conch didn'
2d120 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65  t match or we ne
2d130 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
2d140 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  ew one */.      
2d150 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
2d160 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
2d170 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b      proxyGetLock
2d180 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74  Path(pCtx->dbPat
2d190 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  h, lockPath, MAX
2d1a0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2d1b0 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d    tempLockPath =
2d1c0 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20   lockPath;.     
2d1d0 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
2d1e0 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
2d1f0 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74  path _only_ if t
2d200 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
2d210 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
2d220 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64     .      /* upd
2d230 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68  ate conch with h
2d240 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68  ost and path (th
2d250 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20  is will fail if 
2d260 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
2d270 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61      ** has a sha
2d280 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79  red lock already
2d290 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ), if the host i
2d2a0 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74  d matches, use t
2d2b0 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20  he big.      ** 
2d2c0 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stick..      */.
2d2d0 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f        futimes(co
2d2e0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c  nchFile->h, NULL
2d2f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73  );.      if( hos
2d300 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65  tIdMatch && !cre
2d310 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
2d320 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c      if( conchFil
2d330 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e  e->pInode && con
2d340 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  chFile->pInode->
2d350 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
2d360 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
2d370 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
2d380 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
2d390 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
2d3a0 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   in this.       
2d3b0 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
2d3c0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
2d3d0 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
2d3e0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
2d3f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
2d400 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
2d410 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20  e {          .  
2d420 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
2d430 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  xyConchLock(pFil
2d440 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43  e, myHostID, EXC
2d450 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2d460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2d470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2d480 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
2d490 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
2d4a0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2d4b0 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f  File, EXCLUSIVE_
2d4c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
2d4d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2d4e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d4f0 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66 66    char writeBuff
2d500 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  er[PROXY_MAXCONC
2d510 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
2d520 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30  nt writeSize = 0
2d530 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
2d540 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b 30     writeBuffer[0
2d550 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f  ] = (char)PROXY_
2d560 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20  CONCHVERSION;.  
2d570 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72        memcpy(&wr
2d580 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2d590 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
2d5a0 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
2d5b0 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  IDLEN);.        
2d5c0 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
2d5d0 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b  oxyPath!=NULL ){
2d5e0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
2d5f0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
2d600 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
2d610 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  , pCtx->lockProx
2d620 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
2d630 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  N);.        }els
2d640 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  e{.          str
2d650 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  lcpy(&writeBuffe
2d660 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
2d670 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  X], tempLockPath
2d680 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2d690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d6a0 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f   writeSize = PRO
2d6b0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73  XY_PATHINDEX + s
2d6c0 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66  trlen(&writeBuff
2d6d0 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
2d6e0 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74  EX]);.        ft
2d6f0 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c  runcate(conchFil
2d700 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29  e->h, writeSize)
2d710 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  ;.        rc = u
2d720 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65  nixWrite((sqlite
2d730 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69  3_file *)conchFi
2d740 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c  le, writeBuffer,
2d750 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a   writeSize, 0);.
2d760 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f          fsync(co
2d770 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  nchFile->h);.   
2d780 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72       /* If we cr
2d790 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63  eated a new conc
2d7a0 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74  h file (not just
2d7b0 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e   updated the con
2d7c0 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20  tents of a .    
2d7d0 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f       ** valid co
2d7e0 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74  nch file), try t
2d7f0 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d  o match the perm
2d800 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
2d810 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20  atabase .       
2d820 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2d830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d840 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b  & createConch ){
2d850 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2d860 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
2d870 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
2d880 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  fstat(pFile->h, 
2d890 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  &buf);.         
2d8a0 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20   if( err==0 ){. 
2d8b0 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f             mode_
2d8c0 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74  t cmode = buf.st
2d8d0 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53  _mode&(S_IRUSR|S
2d8e0 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50  _IWUSR | S_IRGRP
2d8f0 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20  |S_IWGRP |.     
2d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d920 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f     S_IROTH|S_IWO
2d930 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  TH);.           
2d940 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68   /* try to match
2d950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d960 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f  le R/W permissio
2d970 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75  ns, ignore failu
2d980 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  re */.#ifndef SQ
2d990 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
2d9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 63 68  .            fch
2d9b0 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mod(conchFile->h
2d9c0 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  , cmode);.#else.
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d9e0 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  fchmod(conchFile
2d9f0 2d 3e 68 2c 20 63 6d 6f 64 65 29 21 3d 30 20 29  ->h, cmode)!=0 )
2da00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2da10 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
2da20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2da30 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2da40 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45  "fchmod %o FAILE
2da50 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  D with %d %s\n",
2da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da70 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f         cmode, co
2da80 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
2da90 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
2daa0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2dab0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2dac0 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
2dad0 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63  %o SUCCEDED\n",c
2dae0 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
2daf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2db00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2db10 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
2db20 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
2db30 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2db40 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d  "STAT FAILED[%d]
2db50 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20   with %d %s\n", 
2db60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2db70 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20       err, code, 
2db80 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
2db90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2dba0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2dbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63      }.      conc
2dbc0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2dbd0 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
2dbe0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
2dbf0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2dc00 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74        .    end_t
2dc10 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20  akeconch:.      
2dc20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
2dc30 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c  ROXY: CLOSE  %d\
2dc40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
2dc50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2dc60 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
2dc70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20  ->openFlags ){. 
2dc80 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
2dc90 2d 3e 68 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66  ->h>=0 ){.#ifdef
2dca0 20 53 54 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52   STRICT_CLOSE_ER
2dcb0 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 69 66  ROR.          if
2dcc0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  ( close(pFile->h
2dcd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2dce0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2dcf0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
2dd00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dd10 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
2dd20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2dd30 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 63 6c  lse.          cl
2dd40 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f  ose(pFile->h); /
2dd50 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
2dd60 66 64 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65  fd if fail */.#e
2dd70 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
2dd80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
2dd90 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  = -1;.        in
2dda0 74 20 66 64 20 3d 20 6f 70 65 6e 28 70 43 74 78  t fd = open(pCtx
2ddb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d  ->dbPath, pFile-
2ddc0 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20  >openFlags,.    
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dde0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
2ddf0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2de00 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  S);.        OSTR
2de10 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
2de20 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66  : OPEN  %d\n", f
2de30 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d));.        if(
2de40 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
2de50 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66      pFile->h = f
2de60 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
2de70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53  {.          rc=S
2de80 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2de90 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42  KPT; /* SQLITE_B
2dea0 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f  USY? proxyTakeCo
2deb0 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20  nch called.     
2dec0 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63        during loc
2ded0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
2dee0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2def0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2df00 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b  K && !pCtx->lock
2df10 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20  Proxy ){.       
2df20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65   char *path = te
2df30 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d  mpLockPath ? tem
2df40 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78  pLockPath : pCtx
2df50 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
2df60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
2df70 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
2df80 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c  e(path, &pCtx->l
2df90 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20  ockProxy, 1);.  
2dfa0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dfb0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
2dfc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74  QLITE_NOMEM && t
2dfd0 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b  ryOldLockPath ){
2dfe0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65  .          /* we
2dff0 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65   couldn't create
2e000 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2e010 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c  file with the ol
2e020 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
2e030 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
2e040 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20  o try again via 
2e050 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20  auto-naming .   
2e060 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e070 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63       forceNewLoc
2e080 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  kPath = 1;.     
2e090 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50       tryOldLockP
2e0a0 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ath = 0;.       
2e0b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
2e0c0 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  go back to the d
2e0d0 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74  o {} while start
2e0e0 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69   point, try agai
2e0f0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  n */.        }. 
2e100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e120 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
2e130 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  d to make a copy
2e140 20 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65   of path if we e
2e150 78 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c  xtracted the val
2e160 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  ue.         ** f
2e170 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69  rom the conch fi
2e180 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77  le or the path w
2e190 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  as allocated on 
2e1a0 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20  the stack.      
2e1b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2e1c0 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29  ( tempLockPath )
2e1d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
2e1e0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2e1f0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2e200 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  p(0, tempLockPat
2e210 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  h);.          if
2e220 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
2e230 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
2e240 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e250 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2e260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2e270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e290 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
2e2a0 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20  conchHeld = 1;. 
2e2b0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2e2c0 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
2e2d0 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  oxy->pMethod == 
2e2e0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f  .          afpLo
2e300 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66  ckingContext *af
2e310 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pCtx;.          
2e320 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63  afpCtx = (afpLoc
2e330 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43  kingContext *)pC
2e340 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c  tx->lockProxy->l
2e350 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
2e360 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d           afpCtx-
2e370 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  >dbPath = pCtx->
2e380 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
2e390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e3a0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2e3b0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
2e3c0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
2e3d0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2e3e0 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
2e3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
2e400 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43  TRACE(("TAKECONC
2e410 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
2e420 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
2e430 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
2e440 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61  LITE_OK?"ok":"fa
2e450 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 72  iled"));.      r
2e460 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20  eturn rc;.    } 
2e470 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e  while (1); /* in
2e480 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
2e490 20 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f   retry the :auto
2e4a0 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20  : lock file - . 
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4c0 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76  ** we should nev
2e4d0 65 72 20 67 65 74 20 68 65 72 65 20 65 78 63 65  er get here exce
2e4e0 70 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74  pt via the 'cont
2e4f0 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20  inue' call. */. 
2e500 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
2e510 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63  File holds a loc
2e520 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c  k on a conch fil
2e530 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  e, then release 
2e540 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  that lock..*/.st
2e550 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65  atic int proxyRe
2e560 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46  leaseConch(unixF
2e570 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
2e580 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e590 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  K;         /* Su
2e5a0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
2e5b0 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  code */.  proxyL
2e5c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2e5d0 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63  Ctx;  /* The loc
2e5e0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72  king context for
2e5f0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2e600 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  */.  unixFile *c
2e610 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
2e620 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2e630 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20  conch file */.. 
2e640 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f   pCtx = (proxyLo
2e650 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
2e660 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
2e670 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  text;.  conchFil
2e680 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
2e690 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ile;.  OSTRACE((
2e6a0 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25  "RELEASECONCH  %
2e6b0 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
2e6c0 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
2e6d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43  ,.           (pC
2e6e0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2e6f0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
2e700 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
2e710 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  :"), .          
2e720 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 69   getpid()));.  i
2e730 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
2e740 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ld>0 ){.    rc =
2e750 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2e760 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
2e770 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2e780 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  hFile, NO_LOCK);
2e790 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e  .  }.  pCtx->con
2e7a0 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53  chHeld = 0;.  OS
2e7b0 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43  TRACE(("RELEASEC
2e7c0 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
2e7d0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
2e7e0 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
2e7f0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
2e800 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20   "failed")));.  
2e810 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e820 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
2e830 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
2e840 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74   file, compute t
2e850 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63  he name of its c
2e860 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74  onch file..** St
2e870 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ore the conch fi
2e880 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79  lename in memory
2e890 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2e8a0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
2e8b0 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68  .** Make *pConch
2e8c0 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68  Path point to th
2e8d0 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74  e new name.  Ret
2e8e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
2e8f0 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53   success.** or S
2e900 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75  QLITE_NOMEM if u
2e910 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20  nable to obtain 
2e920 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
2e930 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2e940 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
2e950 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c  ring that the al
2e960 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
2e970 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74  * space is event
2e980 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  ually freed..**.
2e990 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69  ** *pConchPath i
2e9a0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  s set to NULL if
2e9b0 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
2e9c0 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
2e9d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2e9e0 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
2e9f0 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a  hPathname(char *
2ea00 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70  dbPath, char **p
2ea10 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e  ConchPath){.  in
2ea20 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2ea40 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2ea50 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29   int len = (int)
2ea60 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20  strlen(dbPath); 
2ea70 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74  /* Length of dat
2ea80 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d  abase filename -
2ea90 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61   dbPath */.  cha
2eaa0 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20  r *conchPath;   
2eab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75             /* bu
2eac0 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
2ead0 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68   construct conch
2eae0 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   name */..  /* A
2eaf0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
2eb00 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
2eb10 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  name and initial
2eb20 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a  ize the name to.
2eb30 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
2eb40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2eb50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20  tabase file. */ 
2eb60 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20   .  *pConchPath 
2eb70 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63  = conchPath = (c
2eb80 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2eb90 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20  lloc(len + 8);. 
2eba0 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d   if( conchPath==
2ebb0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ebc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2ebd0 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68  }.  memcpy(conch
2ebe0 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65  Path, dbPath, le
2ebf0 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  n+1);.  .  /* no
2ec00 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62  w insert a "." b
2ec10 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f  efore the last /
2ec20 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
2ec30 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20  for( i=(len-1); 
2ec40 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20  i>=0; i-- ){.   
2ec50 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69   if( conchPath[i
2ec60 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
2ec70 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  i++;.      break
2ec80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f  ;.    }.  }.  co
2ec90 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a  nchPath[i]='.';.
2eca0 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20    while ( i<len 
2ecb0 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68  ){.    conchPath
2ecc0 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b  [i+1]=dbPath[i];
2ecd0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
2ece0 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22   /* append the "
2ecf0 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74  -conch" suffix t
2ed00 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
2ed10 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74  memcpy(&conchPat
2ed20 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22  h[i+1], "-conch"
2ed30 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 7);.  assert( 
2ed40 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63  (int)strlen(conc
2ed50 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20  hPath) == len+7 
2ed60 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
2ed70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54  ITE_OK;.}.../* T
2ed80 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e  akes a fully con
2ed90 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f  figured proxy lo
2eda0 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78  cking-style unix
2edb0 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68   file and switch
2edc0 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  es.** the local 
2edd0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a  lock file path .
2ede0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77  */.static int sw
2edf0 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
2ee00 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
2ee10 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  e, const char *p
2ee20 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ath) {.  proxyLo
2ee30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2ee40 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2ee50 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
2ee60 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2ee70 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74  ;.  char *oldPat
2ee80 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
2ee90 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72  oxyPath;.  int r
2eea0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2eeb0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
2eec0 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
2eed0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2eee0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20  LITE_BUSY;.  }  
2eef0 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74  ..  /* nothing t
2ef00 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68  o do if the path
2ef10 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a   is NULL, :auto:
2ef20 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20   or matches the 
2ef30 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f  existing path */
2ef40 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
2ef50 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
2ef60 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
2ef70 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20  :auto:") ||.    
2ef80 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72  (oldPath && !str
2ef90 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61  ncmp(oldPath, pa
2efa0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
2efb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2efc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2efd0 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
2efe0 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74  *lockProxy = pCt
2eff0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2f000 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
2f010 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78  y=NULL;.    pCtx
2f020 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b  ->conchHeld = 0;
2f030 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f  .    if( lockPro
2f040 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  xy!=NULL ){.    
2f050 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e    rc=lockProxy->
2f060 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
2f070 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
2f080 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
2f090 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f0a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
2f0b0 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f  te3_free(lockPro
2f0c0 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xy);.    }.    s
2f0d0 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50  qlite3_free(oldP
2f0e0 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e  ath);.    pCtx->
2f0f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
2f100 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2f110 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20  0, path);.  }.  
2f120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f130 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20  ./*.** pFile is 
2f140 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
2f150 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61  been opened by a
2f160 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c   prior xOpen cal
2f170 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73  l.  dbPath.** is
2f180 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
2f190 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54   at least MAXPAT
2f1a0 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72  HLEN+1 character
2f1b0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
2f1c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69   This routine fi
2f1d0 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  nd the filename 
2f1e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2f1f0 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73  pFile and writes
2f200 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74   it.** int dbPat
2f210 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
2f220 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
2f230 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  orUnixFile(unixF
2f240 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72  ile *pFile, char
2f250 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64   *dbPath){.#if d
2f260 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2f270 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ).  if( pFile->p
2f280 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f  Method == &afpIo
2f290 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2f2a0 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70  * afp style keep
2f2b0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2f2c0 20 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20   the db path in 
2f2d0 74 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65  the filePath fie
2f2e0 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ld .    ** of th
2f2f0 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20  e struct */.    
2f300 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
2f310 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
2f320 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2f330 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
2f340 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
2f350 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e  ath, ((afpLockin
2f360 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
2f370 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2f380 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41  )->dbPath, MAXPA
2f390 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65  THLEN);.  } else
2f3a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
2f3b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
2f3c0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2f3d0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20  s ){.    /* dot 
2f3e0 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20  lock style uses 
2f3f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2f400 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
2f410 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a   dot lock.    **
2f420 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2f430 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
2f440 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65  en((char *)pFile
2f450 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2f460 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f  ) - strlen(DOTLO
2f470 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20  CK_SUFFIX);.    
2f480 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28  memcpy(dbPath, (
2f490 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
2f4a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65  ckingContext, le
2f4b0 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  n + 1);.  }else{
2f4c0 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65  .    /* all othe
2f4d0 72 20 73 74 79 6c 65 73 20 75 73 65 20 74 68 65  r styles use the
2f4e0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
2f4f0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62   to store the db
2f500 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2f510 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
2f520 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
2f530 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
2f540 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
2f550 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68    strlcpy(dbPath
2f560 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
2f570 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
2f580 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2f590 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2f5a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2f5b0 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20  akes an already 
2f5c0 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66  filled in unix f
2f5d0 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69  ile and alters i
2f5e0 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f  t so all file lo
2f5f0 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62  cking .** will b
2f600 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  e performed on t
2f610 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c  he local proxy l
2f620 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66  ock file.  The f
2f630 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a  ollowing fields.
2f640 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64  ** are preserved
2f650 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2f660 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20  context so that 
2f670 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
2f680 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65  ored and .** the
2f690 20 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20   unix structure 
2f6a0 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64  properly cleaned
2f6b0 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d   up at close tim
2f6c0 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67  e:.**  ->locking
2f6d0 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d  Context.**  ->pM
2f6e0 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20  ethod.*/.static 
2f6f0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
2f700 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
2f710 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73  ile *pFile, cons
2f720 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
2f730 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2f740 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63  ntext *pCtx;.  c
2f750 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41  har dbPath[MAXPA
2f760 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20  THLEN+1];       
2f770 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2f780 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2f790 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68    char *lockPath
2f7a0 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20  =NULL;.  int rc 
2f7b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
2f7c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
2f7d0 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
2f7e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f7f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
2f800 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
2f810 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  orUnixFile(pFile
2f820 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28  , dbPath);.  if(
2f830 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
2f840 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
2f850 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
2f860 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  ") ){.    lockPa
2f870 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  th=NULL;.  }else
2f880 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28  {.    lockPath=(
2f890 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d  char *)path;.  }
2f8a0 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
2f8b0 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66  TRANSPROXY  %d f
2f8c0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
2f8d0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
2f8e0 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20        (lockPath 
2f8f0 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61  ? lockPath : ":a
2f900 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
2f910 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71  ));..  pCtx = sq
2f920 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
2f930 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
2f940 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
2f950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f960 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
2f970 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73  emset(pCtx, 0, s
2f980 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a  izeof(*pCtx));..
2f990 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
2f9a0 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
2f9b0 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63  dbPath, &pCtx->c
2f9c0 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20  onchFilePath);. 
2f9d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f9e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
2f9f0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
2fa00 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  le(pCtx->conchFi
2fa10 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63  lePath, &pCtx->c
2fa20 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  onchFile, 0);.  
2fa30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fa40 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70  _CANTOPEN && ((p
2fa50 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26  File->openFlags&
2fa60 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b  O_RDWR) == 0) ){
2fa70 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29  .      /* if (a)
2fa80 20 74 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20   the open flags 
2fa90 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20  are not O_RDWR, 
2faa0 28 62 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73  (b) the conch is
2fab0 6e 27 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20  n't there, and. 
2fac0 20 20 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20       ** (c) the 
2fad0 66 69 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72  file system is r
2fae0 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65  ead-only, then e
2faf0 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67  nable no-locking
2fb00 20 61 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a   access..      *
2fb10 2a 20 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52  * Ugh, since O_R
2fb20 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65  DONLY==0x0000 we
2fb30 20 74 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57   test for !O_RDW
2fb40 52 20 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e  R since unixOpen
2fb50 20 61 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a   asserts.      *
2fb60 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73  * that openFlags
2fb70 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20   will have only 
2fb80 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20  one of O_RDONLY 
2fb90 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20  or O_RDWR..     
2fba0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
2fbb0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2fbc0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
2fbd0 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20  t conchInfo;.   
2fbe0 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73     int goLockles
2fbf0 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  s = 0;..      if
2fc00 28 20 73 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e  ( stat(pCtx->con
2fc10 63 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e  chFilePath, &con
2fc20 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  chInfo) == -1 ) 
2fc30 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72  {.        int er
2fc40 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
2fc50 20 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f     if( (err==ENO
2fc60 45 4e 54 29 20 26 26 20 28 73 74 61 74 66 73 28  ENT) && (statfs(
2fc70 64 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  dbPath, &fsInfo)
2fc80 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20   != -1) ){.     
2fc90 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20       goLockless 
2fca0 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  = (fsInfo.f_flag
2fcb0 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d  s&MNT_RDONLY) ==
2fcc0 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   MNT_RDONLY;.   
2fcd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2fce0 20 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c       if( goLockl
2fcf0 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
2fd00 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
2fd10 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c   -1; /* read onl
2fd20 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a  y FS/ lockless *
2fd30 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
2fd40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2fd50 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  }.    }.  }  .  
2fd60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fd70 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b  K && lockPath ){
2fd80 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
2fd90 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
2fda0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f  e3DbStrDup(0, lo
2fdb0 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  ckPath);.  }..  
2fdc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fdd0 4b 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64  K ){.    pCtx->d
2fde0 62 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  bPath = sqlite3D
2fdf0 62 53 74 72 44 75 70 28 30 2c 20 64 62 50 61 74  bStrDup(0, dbPat
2fe00 68 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  h);.    if( pCtx
2fe10 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29  ->dbPath==NULL )
2fe20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2fe30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2fe40 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2fe50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fe60 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73  /* all memory is
2fe70 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78   allocated, prox
2fe80 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20 61  ys are created a
2fe90 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20  nd assigned, .  
2fea0 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20    ** switch the 
2feb0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2fec0 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
2fed0 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a   return..    */.
2fee0 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63      pCtx->oldLoc
2fef0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46  kingContext = pF
2ff00 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2ff10 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
2ff20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2ff30 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d   pCtx;.    pCtx-
2ff40 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46  >pOldMethod = pF
2ff50 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20  ile->pMethod;.  
2ff60 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
2ff70 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f   = &proxyIoMetho
2ff80 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2ff90 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
2ffa0 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 70  File ){ .      p
2ffb0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e  Ctx->conchFile->
2ffc0 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
2ffd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
2ffe0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29  pCtx->conchFile)
2fff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
30000 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
30010 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
30020 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
30030 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
30040 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
30050 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
30060 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20  FilePath); .    
30070 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
30080 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  x);.  }.  OSTRAC
30090 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E(("TRANSPROXY  
300a0 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
300b0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
300c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
300d0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
300e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
300f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
30100 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20  routine handles 
30110 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
30120 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61  trol() calls tha
30130 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a  t are specific.*
30140 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69  * to proxy locki
30150 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
30160 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
30170 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
30180 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
30190 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
301a0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
301b0 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
301c0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
301d0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
301e0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
301f0 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  *)id;.      if( 
30200 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
30210 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
30220 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  s ){.        pro
30230 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
30240 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
30250 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
30260 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
30270 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72  text;.        pr
30280 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
30290 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
302a0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
302b0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
302c0 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
302d0 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c  *)pArg = pCtx->l
302e0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
302f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30300 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
30310 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a  har **)pArg = ":
30320 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29  auto: (not held)
30330 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
30340 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
30350 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
30360 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b   **)pArg = NULL;
30370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
30380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30390 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
303a0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
303b0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
303c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
303d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
303e0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  d;.      int rc 
303f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30400 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74     int isProxySt
30410 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d  yle = (pFile->pM
30420 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
30430 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20  oMethods);.     
30440 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20   if( pArg==NULL 
30450 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  || (const char *
30460 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  )pArg==0 ){.    
30470 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
30480 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
30490 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
304a0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f  oxy locking - no
304b0 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20  t supported */. 
304c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
304d0 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c  LITE_ERROR /*SQL
304e0 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51  ITE_PROTOCOL? SQ
304f0 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a  LITE_MISUSE?*/;.
30500 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30510 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
30520 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69   off proxy locki
30530 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66  ng - already off
30540 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20   - NOOP */.     
30550 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30560 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
30570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30580 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
30590 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e  proxyPath = (con
305a0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a  st char *)pArg;.
305b0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72          if( isPr
305c0 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  oxyStyle ){.    
305d0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
305e0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
305f0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  = .            (
30600 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
30610 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
30620 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
30630 20 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d        if( !strcm
30640 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22  p(pArg, ":auto:"
30650 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
30660 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
30670 79 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20  yPath &&.       
30680 20 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70          !strncmp
30690 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
306a0 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c  Path, proxyPath,
306b0 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20   MAXPATHLEN)).  
306c0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
306d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
306e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
306f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30700 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c      rc = switchL
30710 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69  ockProxyPath(pFi
30720 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  le, proxyPath);.
30730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30750 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20       /* turn on 
30760 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
30770 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
30780 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
30790 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c  ormUnixFile(pFil
307a0 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
307b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
307c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
307d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
307e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
307f0 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68  ert( 0 );  /* Th
30800 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74  e call assures t
30810 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f  hat only valid o
30820 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20  pcodes are sent 
30830 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  */.    }.  }.  /
30840 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
30850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
30860 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  ROR;.}../*.** Wi
30870 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69  thin this divisi
30880 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67  on (the proxying
30890 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
308a0 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f  ntation) the pro
308b0 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65  cedures.** above
308c0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
308d0 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20  all utilities.  
308e0 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64  The lock-related
308f0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a   methods of the.
30900 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  ** proxy-locking
30910 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
30920 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77  od object follow
30930 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ..*/.../*.** Thi
30940 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
30950 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
30960 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
30970 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
30980 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
30990 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
309a0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
309b0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
309c0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
309d0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
309e0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
309f0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
30a00 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
30a10 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
30a20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
30a30 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
30a40 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
30a50 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
30a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30a70 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
30a80 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
30a90 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
30aa0 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46  esOut) {.  unixF
30ab0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
30ac0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
30ad0 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
30ae0 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
30af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30b00 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
30b10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
30b20 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
30b30 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
30b40 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
30b50 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
30b60 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
30b70 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
30b80 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
30b90 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
30ba0 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65  eturn proxy->pMe
30bb0 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65  thod->xCheckRese
30bc0 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65  rvedLock((sqlite
30bd0 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70  3_file*)proxy, p
30be0 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ResOut);.    }el
30bf0 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64  se{ /* conchHeld
30c00 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
30c10 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75   */.      pResOu
30c20 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t=0;.    }.  }. 
30c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30c40 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
30c50 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
30c60 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
30c70 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
30c80 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
30c90 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
30ca0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
30cb0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
30cc0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
30cd0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
30ce0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
30cf0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
30d00 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
30d10 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
30d20 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
30d30 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
30d40 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
30d50 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
30d60 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
30d70 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
30d80 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
30d90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
30da0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
30db0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
30dc0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
30dd0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
30de0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
30df0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
30e00 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
30e10 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
30e20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
30e30 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
30e40 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
30e50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
30e60 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
30e70 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
30e80 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
30e90 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
30ea0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
30eb0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
30ec0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
30ed0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
30ee0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
30ef0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
30f00 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
30f10 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
30f20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
30f30 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
30f40 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
30f50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
30f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
30f70 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
30f80 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
30f90 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
30fa0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
30fb0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
30fc0 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
30fd0 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
30fe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
31000 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31010 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31020 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31030 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31040 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
31050 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
31060 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
31070 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
31080 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
31090 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
310a0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
310b0 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
310c0 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  , eFileLock);.  
310d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
310e0 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46  Lock = proxy->eF
310f0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  ileLock;.    }el
31100 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
31110 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
31120 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
31130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
31140 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
31150 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
31160 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
31170 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
31180 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
31190 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
311a0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
311b0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
311c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
311d0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
311e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
311f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
31200 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
31210 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
31220 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
31230 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
31240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
31250 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
31260 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
31270 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
31280 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
31290 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
312a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
312b0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
312c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
312d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
312e0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
312f0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
31300 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31310 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
31320 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
31330 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
31340 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
31350 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
31360 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
31370 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
31380 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
31390 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
313a0 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b  proxy, eFileLock
313b0 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
313c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78  eFileLock = prox
313d0 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  y->eFileLock;.  
313e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
313f0 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20  * conchHeld < 0 
31400 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  is lockless */. 
31410 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
31420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
31430 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61 74  lose a file that
31440 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b   uses proxy lock
31450 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
31460 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
31470 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
31480 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
31490 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
314a0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
314b0 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
314c0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
314d0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
314e0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
314f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
31500 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63     unixFile *loc
31510 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  kProxy = pCtx->l
31520 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e  ockProxy;.    un
31530 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
31540 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
31550 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ile;.    int rc 
31560 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
31570 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72   .    if( lockPr
31580 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
31590 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  = lockProxy->pMe
315a0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
315b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
315c0 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29  kProxy, NO_LOCK)
315d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
315e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
315f0 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
31600 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
31610 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
31620 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  )lockProxy);.   
31630 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
31640 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
31650 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72  ite3_free(lockPr
31660 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78  oxy);.      pCtx
31670 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b  ->lockProxy = 0;
31680 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
31690 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20  onchFile ){.    
316a0 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
316b0 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  hHeld ){.       
316c0 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61   rc = proxyRelea
316d0 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  seConch(pFile);.
316e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
316f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31700 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63    }.      rc = c
31710 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31720 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
31730 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
31740 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
31750 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31760 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31770 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  e(conchFile);.  
31780 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
31790 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  free(pCtx->lockP
317a0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
317b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
317c0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
317d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
317e0 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74 68 29  ee(pCtx->dbPath)
317f0 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f 72 65  ;.    /* restore
31800 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f   the original lo
31810 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e  cking context an
31820 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 63  d pMethod then c
31830 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 70  lose it */.    p
31840 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
31850 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64  text = pCtx->old
31860 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
31870 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
31880 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  od = pCtx->pOldM
31890 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74  ethod;.    sqlit
318a0 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20  e3_free(pCtx);. 
318b0 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d     return pFile-
318c0 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
318d0 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
318e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
318f0 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ...#endif /* def
31900 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
31910 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
31920 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
31930 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  /./*.** The prox
31940 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  y locking style 
31950 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
31960 75 73 65 20 77 69 74 68 20 41 46 50 20 66 69 6c  use with AFP fil
31970 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64  esystems..** And
31980 20 73 69 6e 63 65 20 41 46 50 20 69 73 20 6f 6e   since AFP is on
31990 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
319a0 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72 6f 78  MacOSX, the prox
319b0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73  y locking is als
319c0 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65 64 20  o.** restricted 
319d0 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a  to MacOSX..** .*
319e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
319f0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
31a00 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c   proxy lock impl
31a10 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
31a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31a30 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
31a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31a80 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
31a90 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
31aa0 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
31ab0 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ce..**.** This r
31ac0 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
31ad0 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65   all VFS impleme
31ae0 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69  ntations for uni
31af0 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67  x-like operating
31b00 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68  .** systems.  Th
31b10 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20  is routine, and 
31b20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  the sqlite3_os_e
31b30 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61  nd() routine tha
31b40 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68  t follows,.** sh
31b50 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79  ould be the only
31b60 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
31b70 73 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  s file that are 
31b80 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68  visible from oth
31b90 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a  er.** files..**.
31ba0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31bb0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64  is called once d
31bc0 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69 6e 69  uring SQLite ini
31bd0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20  tialization and 
31be0 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74  by a.** single t
31bf0 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f  hread.  The memo
31c00 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e  ry allocation an
31c10 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
31c20 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e  ms have not.** n
31c30 65 63 65 73 73 61 72 69 6c 79 20 62 65 65 6e 20  ecessarily been 
31c40 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
31c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
31c60 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20   called, and so 
31c70 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e  they.** should n
31c80 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69  ot be used..*/.i
31c90 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  nt sqlite3_os_in
31ca0 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20  it(void){ .  /* 
31cb0 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
31cc0 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ing macro define
31cd0 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72  s an initializer
31ce0 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f   for an sqlite3_
31cf0 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  vfs object..  **
31d00 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
31d10 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20 20 54   VFS is NAME.  T
31d20 68 65 20 70 41 70 70 44 61 74 61 20 69 73 20 61  he pAppData is a
31d30 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f   pointer to a po
31d40 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  inter.  ** to th
31d50 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  e "finder" funct
31d60 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74 61 20  ion.  (pAppData 
31d70 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
31d80 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61 75 73  a pointer becaus
31d90 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30  e.  ** silly C90
31da0 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69 74 20   rules prohibit 
31db0 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69  a void* from bei
31dc0 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66 75 6e  ng cast to a fun
31dd0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20  ction pointer.  
31de0 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76  ** and so we hav
31df0 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20  e to go through 
31e00 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
31e10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69   pointer to avoi
31e20 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20  d problems.  ** 
31e30 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77  when compiling w
31e40 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
31e50 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20  rors on GCC.).  
31e60 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e 44  **.  ** The FIND
31e70 45 52 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  ER parameter to 
31e80 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 74 68  this macro is th
31e90 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6f  e name of the po
31ea0 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  inter to the.  *
31eb0 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  * finder-functio
31ec0 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72 2d 66  n.  The finder-f
31ed0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
31ee0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
31ef0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f  .  ** sqlite_io_
31f00 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74  methods object t
31f10 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
31f20 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69  he desired locki
31f30 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  ng.  ** behavior
31f40 73 2e 20 20 53 65 65 20 74 68 65 20 64 69 76 69  s.  See the divi
31f50 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61 74 20  sion above that 
31f60 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4f 4d  contains the IOM
31f70 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72  ETHODS.  ** macr
31f80 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 20 69  o for addition i
31f90 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69  nformation on fi
31fa0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a  nder-functions..
31fb0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66    **.  ** Most f
31fc0 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20 72 65  inders simply re
31fd0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
31fe0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
31ff0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a  3_io_methods.  *
32000 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 74  * object.  But t
32010 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  he "autolockIoFi
32020 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c 65 20  nder" available 
32030 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73 20 61  on MacOSX does a
32040 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72   little.  ** mor
32050 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69 74 20  e than that; it 
32060 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
32070 65 73 79 73 74 65 6d 20 74 79 70 65 20 74 68 61  esystem type tha
32080 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20 20 2a  t hosts the .  *
32090 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
320a0 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63 68 6f  and tries to cho
320b0 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d  ose an locking m
320c0 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69 61 74  ethod appropriat
320d0 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20  e for.  ** that 
320e0 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d 65 2e  filesystem time.
320f0 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
32100 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d 45 2c  UNIXVFS(VFSNAME,
32110 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20 20 20   FINDER) {      
32120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32130 20 20 5c 0a 20 20 20 20 32 2c 20 20 20 20 20 20    \.    2,      
32140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32150 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32170 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75 6e 69  \.    sizeof(uni
32180 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  xFile),     /* s
32190 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20 20 20  zOsFile */      
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
321b0 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45      MAX_PATHNAME
321c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50  ,         /* mxP
321d0 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  athname */      
321e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
321f0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
32200 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
32210 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
32220 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
32230 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  VFSNAME,        
32240 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
32250 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
32260 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 28 76          \.    (v
32270 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20 20 20  oid*)&FINDER,   
32280 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
32290 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
322a0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
322b0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
322c0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20    /* xOpen */   
322d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322e0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 65      \.    unixDe
322f0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
32300 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20 20 20  /* xDelete */   
32310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32320 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63 63 65    \.    unixAcce
32330 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
32340 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20 20 20   xAccess */     
32350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32360 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c 50 61  \.    unixFullPa
32370 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
32380 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20  FullPathname */ 
32390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
323a0 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20      unixDlOpen, 
323b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
323c0 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
323d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
323e0 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20    unixDlError,  
323f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
32400 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
32410 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
32420 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20  unixDlSym,      
32430 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
32440 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
32450 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
32460 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  ixDlClose,      
32470 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
32480 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
32490 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
324a0 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
324b0 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
324c0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
324d0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c      \.    unixSl
324e0 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
324f0 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20 20 20  /* xSleep */    
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32510 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
32520 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
32530 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32550 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c 61 73  \.    unixGetLas
32560 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
32570 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20  GetLastError */ 
32580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
32590 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
325a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
325b0 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  name */         
325c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
325d0 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
325e0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
325f0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 20  entTimeInt64 */ 
32600 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
32610 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
32620 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
32630 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
32640 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
32650 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
32660 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
32670 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
32680 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
32690 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
326a0 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
326b0 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
326c0 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
326d0 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
326e0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
326f0 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
32700 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
32710 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
32720 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
32730 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
32740 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
32750 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
32760 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
32770 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
32780 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
32790 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
327a0 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
327b0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
327c0 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
327d0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
327e0 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
327f0 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
32800 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
32810 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
32820 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
32830 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
32840 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ,.#if OS_VXWORKS
32850 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
32860 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65  ix-namedsem", se
32870 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e  mIoFinder ),.#en
32880 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
32890 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
328a0 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28  YLE.    UNIXVFS(
328b0 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20  "unix-posix",   
328c0 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
328d0 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  ,.#if !OS_VXWORK
328e0 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  S.    UNIXVFS("u
328f0 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66  nix-flock",    f
32900 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a  lockIoFinder ),.
32910 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
32920 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
32930 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
32940 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
32950 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28  __).    UNIXVFS(
32960 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20  "unix-afp",     
32970 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a   afpIoFinder ),.
32980 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
32990 78 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73  x-nfs",      nfs
329a0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20  IoFinder ),.    
329b0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72  UNIXVFS("unix-pr
329c0 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f  oxy",    proxyIo
329d0 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
329e0 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
329f0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
32a00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
32a10 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74   */..  /* Regist
32a20 65 72 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66  er all VFSes def
32a30 69 6e 65 64 20 69 6e 20 74 68 65 20 61 56 66 73  ined in the aVfs
32a40 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f  [] array */.  fo
32a50 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66  r(i=0; i<(sizeof
32a60 28 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71  (aVfs)/sizeof(sq
32a70 6c 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b  lite3_vfs)); i++
32a80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
32a90 66 73 5f 72 65 67 69 73 74 65 72 28 26 61 56 66  fs_register(&aVf
32aa0 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d  s[i], i==0);.  }
32ab0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
32ac0 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  _OK; .}../*.** S
32ad0 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72  hutdown the oper
32ae0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
32af0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f  erface..**.** So
32b00 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
32b10 74 65 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20  tems might need 
32b20 74 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e  to do some clean
32b30 75 70 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69  up in this routi
32b40 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73  ne,.** to releas
32b50 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  e dynamically al
32b60 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e  located objects.
32b70 20 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69    But not on uni
32b80 78 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  x..** This routi
32b90 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ne is a no-op fo
32ba0 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  r unix..*/.int s
32bb0 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
32bc0 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53  id){ .  return S
32bd0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23  QLITE_OK; .}. .#
32be0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32bf0 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.