/ Hex Artifact Content
Login

Artifact f7e7b3e4f6922e3b07250a22c81da766ac2cc8fa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  .h>.#endif...#if
1170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1180: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1190: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11a0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11b0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11c0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11d0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11e0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11f0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1200: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1210: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1220: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1240: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1250: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1260: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1270: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1280: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1290: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12a0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12b0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12c0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12d0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
12e0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
12f0: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1300: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1310: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1320: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1330: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1340: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1350: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1360: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1370: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
1380: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
1390: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13a0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13b0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13c0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13d0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
13e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
13f0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1400: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1410: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1420: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1430: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1440: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1450: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1460: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1470: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1480: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
1490: 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72  . ** Default per
14a0: 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72  missions when cr
14b0: 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78  eating auto prox
14c0: 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65  y dir. */.#ifnde
14d0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
14e0: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
14f0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
1500: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
1510: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
1520: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
1530: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
1540: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1550: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1560: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1570: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1580: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1590: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
15a0: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
15b0: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
15c0: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
15d0: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
15e0: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
15f0: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1600: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1610: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
1620: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
1630: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
1640: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1650: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
1660: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
1670: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1680: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1690: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
16a0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
16b0: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
16c0: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
16d0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
16e0: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
16f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1700: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1710: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
1720: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
1730: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
1740: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
1750: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
1760: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1770: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1780: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1790: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
17a0: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
17b0: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
17c0: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
17d0: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
17e0: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
17f0: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1800: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1810: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
1820: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
1830: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
1840: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
1850: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
1860: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
1870: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1880: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1890: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
18a0: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
18d0: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
18e0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
18f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1900: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1910: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
1920: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
1930: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
1940: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
1950: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1960: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
1970: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1980: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1990: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
19a0: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
19b0: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
19c0: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
19d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
19e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19f0: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1a00: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1a10: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
1a20: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
1a30: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
1a40: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
1a50: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
1a60: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1a90: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1aa0: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1ab0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ad0: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1ae0: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1af0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b20: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1b30: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b40: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b60: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b70: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b90: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1ba0: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1bb0: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1bc0: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1bd0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1c00: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1c10: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1c20: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c30: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c40: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c50: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c60: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c70: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c90: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1ca0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1cc0: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1cd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ce0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cf0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1d20: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d30: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d40: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d70: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d80: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d90: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1da0: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1db0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dd0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1de0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1df0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1e00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1e10: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1e20: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e30: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e60: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e70: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e80: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
1e90: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
1ea0: 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  d *pId;         
1eb0: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
1ec0: 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ID */.#endif.#if
1ed0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
1ee0: 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
1ef0: 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  of variables are
1f00: 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77   used to track w
1f10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1f20: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
1f30: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79  on counter in by
1f40: 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74  tes 24-27 of dat
1f50: 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
1f60: 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65  updated.  ** whe
1f70: 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f  never any part o
1f80: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
1f90: 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65  hanges.  An asse
1fa0: 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c  rtion fault will
1fb0: 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61  .  ** occur if a
1fc0: 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
1fd0: 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70   without also up
1fe0: 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  dating the trans
1ff0: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e  action.  ** coun
2000: 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20  ter.  This test 
2010: 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64  is made to avoid
2020: 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69   new problems si
2030: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
2040: 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20  * one described 
2050: 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e  by ticket #3584.
2060: 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   .  */.  unsigne
2070: 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72  d char transCntr
2080: 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20  Chng;   /* True 
2090: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
20a0: 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on counter chang
20b0: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
20c0: 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b 20   char dbUpdate; 
20d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20e0: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61  f any part of da
20f0: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2100: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
2110: 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57  d char inNormalW
2120: 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  rite;   /* True 
2130: 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77  if in a normal w
2140: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a  rite operation *
2150: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
2160: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2170: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
2180: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2190: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
21a0: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
21b0: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
21c0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
21d0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
21e0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
21f0: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
2200: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
2210: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
2220: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2230: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72  the unixFile.ctr
2240: 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a  lFlags bitmask:.
2250: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2260: 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20  ILE_EXCL        
2270: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
2280: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
2290: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
22a0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
22b0: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78  E_RDONLY      0x
22c0: 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  02     /* Connec
22d0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
22e0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22f0: 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
2300: 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65  L 0x04     /* Pe
2310: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
2320: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
2330: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2340: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  YNC.# define UNI
2350: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2360: 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72   0x08     /* Dir
2370: 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64  ectory sync need
2380: 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ed */.#else.# de
2390: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
23a0: 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65  RSYNC    0x00.#e
23b0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49  ndif.#define UNI
23c0: 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  XFILE_PSOW      
23d0: 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51    0x10     /* SQ
23e0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
23f0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
2400: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2410: 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30  LE_DELETE      0
2420: 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74  x20     /* Delet
2430: 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64  e on close */.#d
2440: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55  efine UNIXFILE_U
2450: 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20  RI         0x40 
2460: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
2470: 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79  might have query
2480: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23   parameters */.#
2490: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
24a0: 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30  NOLOCK      0x80
24b0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69       /* Do no fi
24c0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
24d0: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
24e0: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
24f0: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
2500: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
2510: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
2520: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
2530: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
2540: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
2550: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
2560: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
2570: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2580: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2590: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
25a0: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
25b0: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
25c0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
25d0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
25e0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
25f0: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
2600: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
2610: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
2620: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
2630: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
2640: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
2650: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
2660: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
2670: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
2680: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2690: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
26a0: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
26b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
26c0: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
26d0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
26e0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
26f0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
2700: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69  ** Different Uni
2710: 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72  x systems declar
2720: 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66  e open() in diff
2730: 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d  erent ways.  Sam
2740: 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f  e use.** open(co
2750: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f  nst char*,int,mo
2760: 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75  de_t).  Others u
2770: 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  se open(const ch
2780: 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a  ar*,int,...)..**
2790: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
27a0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65  is important whe
27b0: 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65  n using a pointe
27c0: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
27d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66  n..**.** The saf
27e0: 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20  est way to deal 
27f0: 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d  with the problem
2800: 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73   is to always us
2810: 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a  e this wrapper.*
2820: 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68  * which always h
2830: 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c  as the same well
2840: 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61  -defined interfa
2850: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
2860: 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73  t posixOpen(cons
2870: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  t char *zFile, i
2880: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f  nt flags, int mo
2890: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  de){.  return op
28a0: 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c  en(zFile, flags,
28b0: 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f   mode);.}../* Fo
28c0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
28d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
28e0: 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
28f0: 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a  t char*, int*);.
2900: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
2910: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
2920: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
2930: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
2940: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
2950: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
2960: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
2970: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
2980: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
2990: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
29a0: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
29b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
29c0: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
29d0: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
29e0: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
29f0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
2a00: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
2a10: 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73   struct unix_sys
2a20: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
2a30: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
2a40: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2a50: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c  f the sytem call
2a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
2a70: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
2a80: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
2a90: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
2aa0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
2ab0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2ac0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
2ad0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
2ae0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
2af0: 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20    { "open",     
2b00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2b10: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70  call_ptr)posixOp
2b20: 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  en,  0  },.#defi
2b30: 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28  ne osOpen      (
2b40: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2b50: 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79  ar*,int,int))aSy
2b60: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
2b70: 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c  t)..  { "close",
2b80: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2b90: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f  _syscall_ptr)clo
2ba0: 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  se,      0  },.#
2bb0: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20  define osClose  
2bc0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29     ((int(*)(int)
2bd0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
2be0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63  rrent)..  { "acc
2bf0: 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ess",       (sql
2c00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2c10: 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20  )access,     0  
2c20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63  },.#define osAcc
2c30: 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ess    ((int(*)(
2c40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
2c50: 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75  )aSyscall[2].pCu
2c60: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
2c70: 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  cwd",       (sql
2c80: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2c90: 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20  )getcwd,     0  
2ca0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
2cb0: 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a  cwd    ((char*(*
2cc0: 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29  )(char*,size_t))
2cd0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
2ce0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74  rent)..  { "stat
2cf0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
2d00: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2d10: 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d  stat,       0  }
2d20: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74  ,.#define osStat
2d30: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
2d40: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
2d50: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
2d60: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
2d70: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
2d80: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
2d90: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
2da0: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
2db0: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
2dc0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
2dd0: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
2de0: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
2df0: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
2e00: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
2e10: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
2e20: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
2e30: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
2e40: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
2e50: 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61   it is DOS - wha
2e60: 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74  t did you expect
2e70: 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a  ?.*/.#ifdef __DJ
2e80: 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74  GPP__.  { "fstat
2e90: 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20  ",        0,    
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
2eb0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
2ec0: 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23  at(a,b,c)    0.#
2ed0: 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66  else     .  { "f
2ee0: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73  stat",        (s
2ef0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2f00: 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30  tr)fstat,      0
2f10: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
2f20: 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a  stat     ((int(*
2f30: 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61  )(int,struct sta
2f40: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e  t*))aSyscall[5].
2f50: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
2f60: 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65  ..  { "ftruncate
2f70: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
2f80: 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e  yscall_ptr)ftrun
2f90: 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65  cate,  0  },.#de
2fa0: 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65  fine osFtruncate
2fb0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
2fc0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  f_t))aSyscall[6]
2fd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2fe0: 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20  "fcntl",        
2ff0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3000: 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20  _ptr)fcntl,     
3010: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3020: 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74  sFcntl     ((int
3030: 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29  (*)(int,int,...)
3040: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
3050: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
3060: 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  d",         (sql
3070: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3080: 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20  )read,       0  
3090: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
30a0: 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  d      ((ssize_t
30b0: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
30c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38  ze_t))aSyscall[8
30d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
30e0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
30f0: 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  AD) || SQLITE_EN
3100: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
3110: 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  LE.  { "pread", 
3120: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3130: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61  syscall_ptr)prea
3140: 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  d,      0  },.#e
3150: 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  lse.  { "pread",
3160: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3170: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3180: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3190: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
31a0: 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a  Pread     ((ssiz
31b0: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
31c0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61  ,size_t,off_t))a
31d0: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
31e0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
31f0: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
3200: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
3210: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3220: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c  all_ptr)pread64,
3230: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
3240: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
3250: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3260: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3270: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3280: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
3290: 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d64   ((ssize_t(
32a0: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
32b0: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
32c0: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
32d0: 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20  )..  { "write", 
32e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
32f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74  syscall_ptr)writ
3300: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3310: 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20  efine osWrite   
3320: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3330: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3340: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3350: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
3360: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3370: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3380: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3390: 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65  TYLE.  { "pwrite
33a0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
33b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
33c0: 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a  rite,     0  },.
33d0: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
33e0: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
33f0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3400: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3410: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3420: 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73  osPwrite    ((ss
3430: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
3440: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
3450: 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20  off_t))\.       
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79               aSy
3470: 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65  scall[12].pCurre
3480: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3490: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
34a0: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
34b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
34c0: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c  ll_ptr)pwrite64,
34d0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
34e0: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
34f0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3500: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3510: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3520: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
3530: 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e64  ((ssize_t(*
3540: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
3550: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
3560: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
3570: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
3580: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
3590: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
35a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
35b0: 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20  { "fchmod",     
35c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
35d0: 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20  ll_ptr)fchmod,  
35e0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
35f0: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3600: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3610: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3620: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3630: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
3640: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
3650: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
3660: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
3670: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
3680: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
3690: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
36a0: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
36b0: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
36c0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
36d0: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
36e0: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
36f0: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
3700: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3710: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3730: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3740: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
3750: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
3760: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3770: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
3780: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
3790: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37a0: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
37b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
37c0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
37d0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
37e0: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
37f0: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
3800: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
3810: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
3820: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
3830: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
3840: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3850: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
3860: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3870: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
3880: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
3890: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
38a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
38b0: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
38c0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
38d0: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
38e0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
38f0: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
3900: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3910: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3920: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
3930: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3940: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
3950: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3960: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
3970: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3980: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
3990: 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a  pCurrent)..}; /*
39a0: 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   End of the over
39b0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
39c0: 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  calls */../*.** 
39d0: 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74  This is the xSet
39e0: 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74  SystemCall() met
39f0: 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  hod of sqlite3_v
3a00: 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  fs for all of th
3a10: 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65  e.** "unix" VFSe
3a20: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
3a30: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
3a40: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
3a50: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
3a60: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
3a70: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
3a80: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
3a90: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
3aa0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
3ab0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
3ac0: 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74   int unixSetSyst
3ad0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
3ae0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
3af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
3b00: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
3b10: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
3b20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
3b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3b40: 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   of system call 
3b50: 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20  to override */. 
3b60: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3b70: 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f  _ptr pNewFunc  /
3b80: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
3b90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c   system call val
3ba0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
3bb0: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ned int i;.  int
3bc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
3bd0: 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44  FOUND;..  UNUSED
3be0: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
3bf0: 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  sed);.  if( zNam
3c00: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e==0 ){.    /* I
3c10: 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69  f no zName is gi
3c20: 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c  ven, restore all
3c30: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f   system calls to
3c40: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20   their default. 
3c50: 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61     ** settings a
3c60: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20  nd return NULL. 
3c70: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
3c80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f  QLITE_OK;.    fo
3c90: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
3ca0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
3cb0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
3cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
3cd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
3ce0: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ult ){.        a
3cf0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3d00: 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ent = aSyscall[i
3d10: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
3d20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
3d30: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  e{.    /* If zNa
3d40: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
3d50: 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79   operate on only
3d60: 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20   the one system 
3d70: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63  call.    ** spec
3d80: 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
3d90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
3da0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3db0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3dc0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
3dd0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
3de0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
3df0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
3e00: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
3e10: 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b  ].pDefault==0 ){
3e20: 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63  .          aSysc
3e30: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
3e40: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  = aSyscall[i].pC
3e50: 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
3e60: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  }.        rc = S
3e70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
3e80: 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d    if( pNewFunc==
3e90: 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61  0 ) pNewFunc = a
3ea0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
3eb0: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79  ult;.        aSy
3ec0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3ed0: 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20  t = pNewFunc;.  
3ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ef0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
3f00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3f10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3f20: 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65  value of a syste
3f30: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
3f40: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73  NULL if zName is
3f50: 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e   not a.** recogn
3f60: 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c  ized system call
3f70: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20   name.  NULL is 
3f80: 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
3f90: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
3fa0: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
3fb0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
3fc0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79  tatic sqlite3_sy
3fd0: 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65  scall_ptr unixGe
3fe0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
3ff0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
4000: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
4010: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
4020: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
4030: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4040: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
4050: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4060: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4070: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4080: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
4090: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
40a0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
40b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
40c0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
40d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
40e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
40f0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
4100: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
4110: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
4120: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
4130: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
4140: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4150: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
4160: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4170: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
4180: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
4190: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
41a0: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
41b0: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
41c0: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
41d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
41e0: 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43  *unixNextSystemC
41f0: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
4200: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
4210: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
4220: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
4230: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
4240: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
4260: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
4270: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
4280: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4290: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
42a0: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
42b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
42c0: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
42d0: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
42e0: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
42f0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
4300: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
4310: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
4320: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4330: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65  ./*.** Retry ope
4340: 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  n() calls that f
4350: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
4360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4370: 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74  obust_open(const
4380: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c   char *z, int f,
4390: 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72   int m){.  int r
43a0: 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  c;.  do{ rc = os
43b0: 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68  Open(z,f,m); }wh
43c0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
43d0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
43e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
43f0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4400: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
4410: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
4420: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
4430: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
4440: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
4450: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
4460: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
4470: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4480: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
4490: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
44a0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
44b0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
44c0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
44d0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
44e0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
44f0: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
4500: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
4510: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
4520: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
4530: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4540: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
4550: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
4560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
4570: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
4580: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
4590: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
45a0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
45b0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
45c0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
45d0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
45e0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
45f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
4600: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4610: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4620: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4630: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
4640: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
4650: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
4660: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
4670: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
4680: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
4690: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
46a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
46b0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
46c0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
46d0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
46e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
46f0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4700: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4710: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
4720: 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69  endif...#if defi
4730: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
4740: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4750: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
4760: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
4770: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
4780: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
4790: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
47a0: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
47b0: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
47c0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
47d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
47e0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
47f0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
4800: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4810: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
4820: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
4830: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
4840: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
4850: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
4860: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
4870: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
4880: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
4890: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
48a0: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
48b0: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
48c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
48d0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
48e0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
48f0: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
4900: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
4910: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
4920: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
4930: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
4940: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
4950: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
4960: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
4970: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
4980: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4990: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
49a0: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
49b0: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
49c0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
49d0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
49e0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
49f0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
4a00: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
4a10: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
4a20: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
4a30: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
4a40: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
4a50: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
4a60: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
4a70: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
4a80: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
4a90: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
4aa0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
4ab0: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
4ac0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
4ad0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
4ae0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
4af0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
4b00: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
4b10: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
4b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
4b30: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
4b40: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
4b50: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
4b60: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
4b70: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
4b80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
4b90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
4ba0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
4bb0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
4bc0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
4bd0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
4be0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
4bf0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
4c00: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
4c10: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
4c20: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
4c30: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
4c40: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
4c50: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
4c60: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
4c70: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
4c80: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
4c90: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
4ca0: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
4cb0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
4cc0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
4cd0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
4ce0: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
4cf0: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
4d00: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
4d10: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
4d20: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
4d30: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
4d40: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
4d50: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
4d60: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
4d70: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
4d80: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
4d90: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
4da0: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
4db0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
4dc0: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
4dd0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
4de0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4df0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
4e00: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
4e10: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
4e20: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
4e30: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
4e40: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4e50: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
4e60: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
4e70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4e80: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4e90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4ea0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4eb0: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
4ec0: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
4ed0: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
4ee0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
4ef0: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
4f00: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
4f10: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
4f20: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
4f30: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
4f40: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
4f50: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
4f60: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
4f70: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
4f80: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
4f90: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
4fa0: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
4fb0: 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69  o EINTR.*/.stati
4fc0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72  c int robust_ftr
4fd0: 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71  uncate(int h, sq
4fe0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b  lite3_int64 sz){
4ff0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
5000: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
5010: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
5020: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
5030: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
5040: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
5050: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
5060: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
5070: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
5080: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
5090: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
50a0: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
50b0: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
50c0: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
50d0: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
50e0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
50f0: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
5100: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
5110: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
5120: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
5130: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
5140: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
5150: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
5160: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
5170: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
5180: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
5190: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
51a0: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
51b0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
51c0: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
51d0: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
51e0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
51f0: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
5200: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
5210: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
5220: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
5230: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
5240: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
5250: 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45    switch (posixE
5260: 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20  rror) {.#if 0.  
5270: 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
5280: 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f  this code was no
5290: 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  t commented out.
52a0: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73   In theory, this
52b0: 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f   branch.  ** sho
52c0: 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74  uld never be hit
52d0: 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  , as this functi
52e0: 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  on should only b
52f0: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20  e called after. 
5300: 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65   ** a locking-re
5310: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28  lated function (
5320: 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61  i.e. fcntl()) ha
5330: 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a  s returned non-z
5340: 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ero with.  ** th
5350: 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f  e value of errno
5360: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5370: 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20  gument. Since a 
5380: 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20  system call has 
5390: 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72  failed,.  ** err
53a0: 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e  no should be non
53b0: 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -zero..  **.  **
53c0: 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69   Despite this, i
53d0: 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69  f errno really i
53e0: 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c  s zero, we still
53f0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
5400: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
5410: 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d  E_OK. The system
5420: 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e   call failed, an
5430: 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20  d *some* SQLite 
5440: 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a  error should be.
5450: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20    ** propagated 
5460: 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c  back to the call
5470: 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74  er. Commenting t
5480: 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d  his branch out m
5490: 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20  eans errno==0.  
54a0: 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c  ** will be handl
54b0: 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75  ed by the "defau
54c0: 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e  lt:" case below.
54d0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20  .  */.  case 0: 
54e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
54f0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
5500: 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20   case EAGAIN:.  
5510: 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a  case ETIMEDOUT:.
5520: 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20    case EBUSY:.  
5530: 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61  case EINTR:.  ca
5540: 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20  se ENOLCK:  .   
5550: 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72   /* random NFS r
5560: 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65  etry error, unle
5570: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5580: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
5590: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
55a0: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
55b0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
55c0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
55d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
55e0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63  E_BUSY;.    .  c
55f0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20  ase EACCES: .   
5600: 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69   /* EACCES is li
5610: 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67  ke EAGAIN during
5620: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
5630: 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  ons, but not any
5640: 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20   other time*/.  
5650: 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45    if( (sqliteIOE
5660: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
5670: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  RR_LOCK) || ..(s
5680: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
5690: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
56a0: 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49  K) || ..(sqliteI
56b0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
56c0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
56d0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
56e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
56f0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
5700: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
5710: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5720: 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20    }.    /* else 
5730: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  fall through */.
5740: 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20    case EPERM: . 
5750: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5760: 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a  _PERM;.    .  /*
5770: 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79   EDEADLK is only
5780: 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20 63   possible if a c
5790: 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  all to fcntl(F_S
57a0: 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e 20  ETLKW) is made. 
57b0: 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f  And.  ** this mo
57c0: 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65 73  dule never makes
57d0: 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e   such a call. An
57e0: 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53 51  d the code in SQ
57f0: 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20 2a  Lite itself .  *
5800: 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 53  * asserts that S
5810: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
5820: 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72 65 74  KED is never ret
5830: 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73 65  urned. For these
5840: 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68   reasons.  ** th
5850: 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
5860: 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49  commented out. I
5870: 66 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f 65  f the system doe
5880: 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20 45  s set errno to E
5890: 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65  DEADLK,.  ** the
58a0: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
58b0: 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20 77  IOERR_XXX code w
58c0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
58d0: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73 65   */.#if 0.  case
58e0: 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65   EDEADLK:.    re
58f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
5900: 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69  R_BLOCKED;.#endi
5910: 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f  f.    .#if EOPNO
5920: 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20  TSUPP!=ENOTSUP. 
5930: 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50   case EOPNOTSUPP
5940: 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68  : .    /* someth
5950: 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c  ing went terribl
5960: 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64  y awry, unless d
5970: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
5980: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
5990: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
59a0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
59b0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
59c0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
59d0: 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55  if.#ifdef ENOTSU
59e0: 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50  P.  case ENOTSUP
59f0: 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69  : .    /* invali
5a00: 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72  d fd, unless dur
5a10: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
5a20: 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65  support introspe
5a30: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
5a40: 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61  .     * it actua
5a50: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
5a60: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
5a70: 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63  .  case EIO:.  c
5a80: 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73  ase EBADF:.  cas
5a90: 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65  e EINVAL:.  case
5aa0: 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73   ENOTCONN:.  cas
5ab0: 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65  e ENODEV:.  case
5ac0: 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45   ENXIO:.  case E
5ad0: 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53  NOENT:.#ifdef ES
5ae0: 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  TALE            
5af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41           /* ESTA
5b00: 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  LE is not define
5b10: 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73  d on Interix sys
5b20: 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45  tems */.  case E
5b30: 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20  STALE:.#endif.  
5b40: 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20  case ENOSYS:.   
5b50: 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64   /* these should
5b60: 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e   force the clien
5b70: 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66  t to close the f
5b80: 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63  ile and reconnec
5b90: 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61  t */.    .  defa
5ba0: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
5bb0: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
5bc0: 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  }.}..../********
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
5c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
5c30: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
5c40: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
5c50: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
5c60: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
5c70: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
5c80: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
5c90: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
5ca0: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
5cb0: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
5cc0: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
5cd0: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
5ce0: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
5cf0: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
5d00: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
5d10: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
5d20: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
5d30: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
5d40: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
5d50: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
5d60: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
5d70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5d80: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
5d90: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
5da0: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
5db0: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
5dc0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
5dd0: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
5de0: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
5df0: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
5e00: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
5e10: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
5e20: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
5e30: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
5e40: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
5e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
5e60: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
5e70: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
5e80: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
5e90: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
5ea0: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
5eb0: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
5ec0: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
5ed0: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
5ee0: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
5ef0: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
5f00: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
5f10: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
5f20: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
5f30: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
5f40: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
5f50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
5f60: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
5f70: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
5f80: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
5f90: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
5fa0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5fb0: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
5fc0: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
5fd0: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ff0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
6000: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
6010: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
6020: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
6030: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
6040: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
6050: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
6060: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
6070: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
6080: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
6090: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
60a0: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
60b0: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
60c0: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
60d0: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
60e0: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
60f0: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
6100: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
6110: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
6120: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
6130: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
6140: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
6150: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
6160: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
6170: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
6180: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
6190: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
61a0: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
61b0: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
61c0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
61d0: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
61e0: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
61f0: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
6200: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
6210: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
6220: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
6230: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
6240: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6250: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
6260: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
6270: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
6280: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
6290: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
62a0: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
62b0: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
62c0: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
62d0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
62e0: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
62f0: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
6300: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
6310: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
6320: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
6330: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
6340: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
6350: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6360: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
6370: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6380: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
6390: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
63a0: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
63b0: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
63c0: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
63d0: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
63e0: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
63f0: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
6400: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
6410: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
6420: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6430: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
6440: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
6450: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
6460: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
6470: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
6480: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
6490: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
64a0: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
64b0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
64c0: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
64d0: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
64e0: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
64f0: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
6500: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
6510: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
6520: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
6530: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
6540: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
6550: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
6560: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
6570: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
6580: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
6590: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
65a0: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
65b0: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
65c0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
65d0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
65e0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
65f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
6600: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6610: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
6620: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
6630: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
6640: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6650: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
6660: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
6670: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
6680: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
6690: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
66a0: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
66b0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
66c0: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
66d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6700: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
6710: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
6720: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
6730: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
6740: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
6750: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
6760: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
6770: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
6780: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28  izeof(*pNew) + (
6790: 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  n+1) );.  if( pN
67a0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
67b0: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ;.  pNew->zCanon
67c0: 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  icalName = (char
67d0: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65  *)&pNew[1];.  me
67e0: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  mcpy(pNew->zCano
67f0: 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f  nicalName, zAbso
6800: 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a  luteName, n+1);.
6810: 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d    n = vxworksSim
6820: 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e  plifyName(pNew->
6830: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
6840: 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  n);..  /* Search
6850: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
6860: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
6870: 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63  hing the canonic
6880: 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66  al name..  ** If
6890: 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e   found, incremen
68a0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
68b0: 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  count and return
68c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20   a pointer to.  
68d0: 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ** the existing 
68e0: 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20  file ID..  */.  
68f0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
6900: 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61  ;.  for(pCandida
6910: 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  te=vxworksFileLi
6920: 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20  st; pCandidate; 
6930: 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64  pCandidate=pCand
6940: 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  idate->pNext){. 
6950: 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74     if( pCandidat
6960: 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20  e->nName==n .   
6970: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e    && memcmp(pCan
6980: 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63  didate->zCanonic
6990: 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43  alName, pNew->zC
69a0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
69b0: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
69c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
69d0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61  New);.       pCa
69e0: 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b  ndidate->nRef++;
69f0: 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  .       unixLeav
6a00: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
6a10: 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61   return pCandida
6a20: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  te;.    }.  }.. 
6a30: 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73   /* No match was
6a40: 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c   found.  We will
6a50: 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65   make a new file
6a60: 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e   ID */.  pNew->n
6a70: 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d  Ref = 1;.  pNew-
6a80: 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e  >nName = n;.  pN
6a90: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f  ew->pNext = vxwo
6aa0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76  rksFileList;.  v
6ab0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
6ac0: 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61   pNew;.  unixLea
6ad0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
6ae0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
6af0: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
6b00: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6b10: 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c   on a vxworksFil
6b20: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65  eId object.  Fre
6b30: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
6b40: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
6b50: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
6b60: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
6b70: 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c   void vxworksRel
6b80: 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63  easeFileId(struc
6b90: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6ba0: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74  *pId){.  unixEnt
6bb0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
6bc0: 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30  ert( pId->nRef>0
6bd0: 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d   );.  pId->nRef-
6be0: 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52  -;.  if( pId->nR
6bf0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ef==0 ){.    str
6c00: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6c10: 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  d **pp;.    for(
6c20: 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c  pp=&vxworksFileL
6c30: 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21  ist; *pp && *pp!
6c40: 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70  =pId; pp = &((*p
6c50: 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20  p)->pNext)){}.  
6c60: 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70    assert( *pp==p
6c70: 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Id );.    *pp = 
6c80: 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pId->pNext;.    
6c90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
6ca0: 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
6cb0: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e  veMutex();.}.#en
6cc0: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
6cd0: 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  S */./**********
6ce0: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69  ***** End of Uni
6cf0: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
6d00: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
6d10: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
6d20: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
6d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d70: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
6d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6dc0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6de0: 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72  ** Posix Advisor
6df0: 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
6e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e10: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53  ******.**.** POS
6e20: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
6e30: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20  s are broken by 
6e40: 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54  design.  ANSI ST
6e50: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
6e60: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
6e70: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
6e80: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
6e90: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
6ea0: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
6eb0: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
6ec0: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
6ed0: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
6ee0: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
6ef0: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
6f00: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
6f10: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
6f20: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
6f30: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
6f40: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
6f50: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
6f60: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
6f70: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
6f80: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
6f90: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
6fa0: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
6fb0: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
6fc0: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
6fd0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
6fe0: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
6ff0: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
7000: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
7010: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7020: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
7030: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
7040: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
7050: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
7060: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
7070: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
7080: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
7090: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
70a0: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
70b0: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
70c0: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
70d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
70e0: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
70f0: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
7100: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
7110: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
7120: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
7130: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
7140: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
7150: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
7160: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
7170: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
7180: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
7190: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
71a0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
71b0: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
71c0: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
71d0: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
71e0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
71f0: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
7200: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
7210: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  names..**.** Thi
7220: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  s means that we 
7230: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
7240: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
7250: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
7260: 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65  s.** among compe
7270: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
7280: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7290: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
72a0: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
72b0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
72c0: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
72d0: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
72e0: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
72f0: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
7300: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
7310: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
7320: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
7330: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
7340: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
7350: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
7360: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
7370: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
7380: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
7390: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
73a0: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
73b0: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
73c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
73d0: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
73e0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
73f0: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
7400: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
7410: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
7420: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
7430: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
7440: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
7450: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
7460: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
7470: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
7480: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
7490: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
74a0: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
74b0: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
74c0: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
74d0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
74e0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
74f0: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
7500: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
7510: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
7520: 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75  ** (Aside: The u
7530: 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62  se of inode numb
7540: 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44  ers as unique ID
7550: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
7560: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46  on VxWorks..** F
7570: 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68  or VxWorks, we h
7580: 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61  ave to use the a
7590: 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75  lternative uniqu
75a0: 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65  e ID system base
75b0: 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61  d on.** canonica
75c0: 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  l filename and i
75d0: 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68  mplemented in th
75e0: 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73  e previous divis
75f0: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion.).**.** The 
7600: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
7610: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
7620: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
7630: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
7640: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7650: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
7660: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
7670: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
7680: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
7690: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
76a0: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
76b0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
76c0: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
76d0: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
76e0: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
76f0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
7700: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
7710: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
7720: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
7730: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
7740: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
7750: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
7760: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
7770: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
7780: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
7790: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
77a0: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
77b0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
77c0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
77d0: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
77e0: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
77f0: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
7800: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
7810: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
7820: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
7830: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
7840: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
7850: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
7860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
7870: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
7880: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
7890: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
78a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
78b0: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
78c0: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
78d0: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
78e0: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
78f0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
7900: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
7910: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
7920: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
7930: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
7940: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
7950: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
7960: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
7970: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
7980: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
7990: 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20  *.** But wait:  
79a0: 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f  there are yet mo
79b0: 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  re problems with
79c0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
79d0: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  locks..**.** If 
79e0: 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65  you close a file
79f0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
7a00: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c   points to a fil
7a10: 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73  e that has locks
7a20: 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f  ,.** all locks o
7a30: 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
7a40: 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68   are owned by th
7a50: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
7a60: 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65  s are.** release
7a70: 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  d.  To work arou
7a80: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  nd this problem,
7a90: 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49   each unixInodeI
7aa0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61  nfo object.** ma
7ab0: 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20  intains a count 
7ac0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
7ad0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f   pending locks o
7ae0: 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20  n tha inode..** 
7af0: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
7b00: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
7b10: 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66   an unixFile, if
7b20: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74   there are.** ot
7b30: 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65  her unixFile ope
7b40: 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e  n on the same in
7b50: 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c  ode that are hol
7b60: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20  ding locks, the 
7b70: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65  call.** to close
7b80: 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  () the file desc
7b90: 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72  riptor is deferr
7ba0: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20  ed until all of 
7bb0: 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e  the locks clear.
7bc0: 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64  .** The unixInod
7bd0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
7be0: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
7bf0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
7c00: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
7c10: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
7c20: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
7c30: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
7c40: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
7c50: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
7c60: 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72  *.** Yet another
7c70: 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78   problem:  Linux
7c80: 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70  Threads do not p
7c90: 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f  lay well with po
7ca0: 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  six locks..**.**
7cb0: 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73   Many older vers
7cc0: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73  ions of linux us
7cd0: 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61  e the LinuxThrea
7ce0: 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68  ds library which
7cf0: 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78   is.** not posix
7d00: 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64   compliant.  Und
7d10: 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  er LinuxThreads,
7d20: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
7d30: 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63  by thread.** A c
7d40: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
7d50: 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20  d or overridden 
7d60: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
7d70: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79  hread B..** Only
7d80: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f   thread A can mo
7d90: 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20  dify the lock.  
7da0: 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  Locking behavior
7db0: 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69   is correct.** i
7dc0: 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e  f the appliation
7dd0: 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20   uses the newer 
7de0: 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72  Native Posix Thr
7df0: 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54  ead Library (NPT
7e00: 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d  L).** on linux -
7e10: 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63   with NPTL a loc
7e20: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
7e30: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
7e40: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74  de locks.** in t
7e50: 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68  hread B.  But th
7e60: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
7e70: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
7e80: 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74  -time which.** t
7e90: 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79  hreading library
7ea0: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
7eb0: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
7ec0: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a  way to know at.*
7ed0: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  * compile-time w
7ee0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7ef0: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
7f00: 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72  ide locks on thr
7f10: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61  ead B..** One ha
7f20: 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69  s to do a run-ti
7f30: 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63  me check to disc
7f40: 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f  over the behavio
7f50: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  r of the.** curr
7f60: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ent process..**.
7f70: 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74  ** SQLite used t
7f80: 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54  o support LinuxT
7f90: 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70  hreads.  But sup
7fa0: 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68  port for LinuxTh
7fb0: 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f  reads.** was dro
7fc0: 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77  pped beginning w
7fd0: 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e  ith version 3.7.
7fe0: 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  0.  SQLite will 
7ff0: 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a  still work with.
8000: 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ** LinuxThreads 
8010: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31  provided that (1
8020: 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f  ) there is no mo
8030: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e  re than one conn
8040: 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64  ection .** per d
8050: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
8060: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
8070: 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73   and (2) databas
8080: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
8090: 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72   do not move acr
80a0: 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  oss threads..*/.
80b0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
80c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
80d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
80e0: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
80f0: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
8100: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75  e a particular u
8110: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
8120: 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ect..*/.struct u
8130: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
8140: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
8150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
8160: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
8170: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
8180: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
8190: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
81a0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
81b0: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
81c0: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
81f0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
8200: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
8210: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8220: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
8230: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
8240: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
8250: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
8260: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
8270: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
8280: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
8290: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
82a0: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
82b0: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
82c0: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
82d0: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
82e0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
82f0: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
8300: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
8310: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
8320: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
8330: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
8340: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
8350: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
8360: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
8370: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
8380: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
8390: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
83a0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
83b0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
83c0: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
83d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
83e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
83f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8400: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
8410: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
8420: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
8430: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
8440: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
8450: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
8460: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
8470: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
8480: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
8490: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
84a0: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
84b0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
84e0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
84f0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
8500: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
8510: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
8520: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
8530: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
8540: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
8550: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
8580: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
8590: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
85a0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
85b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
85c0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
85d0: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
85e0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
85f0: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
8600: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
8610: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
8620: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
8630: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
8640: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
8650: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
8660: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
8670: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
8680: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
8690: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
86a0: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
86b0: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
86c0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
86d0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
86e0: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
86f0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
8700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
8710: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
8720: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
8730: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
8740: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
8750: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
8760: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
8770: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
8780: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
8790: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
87a0: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
87b0: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
87c0: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
87d0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
87e0: 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73  LogError_x(), is
87f0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
8800: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
8810: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
8820: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
8830: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
8840: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
8850: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
8860: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
8870: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
8880: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
8890: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
88a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
88b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
88c0: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
88d0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
88e0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
88f0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
8900: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
8910: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
8920: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
8930: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
8940: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
8950: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
8960: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
8970: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
8980: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
8990: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
89a0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
89b0: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
89c0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
89d0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
89e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
89f0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
8a00: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
8a10: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
8a20: 20 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73   and the the ass
8a30: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
8a40: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
8a50: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
8a60: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
8a70: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
8a80: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
8a90: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
8aa0: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
8ab0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
8ac0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8ae0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
8af0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8b00: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
8b10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8b20: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
8b30: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
8b40: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b60: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
8b70: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
8b80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
8bb0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
8bc0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
8bd0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
8be0: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
8bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
8c00: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
8c10: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
8c20: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
8c30: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
8c40: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
8c50: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
8c60: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
8c70: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
8c80: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
8c90: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
8ca0: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
8cb0: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
8cc0: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
8cd0: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
8ce0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
8cf0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
8d00: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
8d10: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
8d20: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
8d30: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
8d40: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
8d50: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
8d60: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
8d70: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
8d80: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
8d90: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
8da0: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
8db0: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
8dc0: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
8dd0: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
8de0: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
8df0: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
8e00: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
8e10: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
8e20: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
8e30: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
8e40: 74 68 61 74 20 0a 20 20 2a 2a 20 72 65 74 75 72  that .  ** retur
8e50: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
8e60: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
8e70: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
8e80: 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e  ssage. That poin
8e90: 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f  ter .  ** may po
8ea0: 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f  int to aErr[], o
8eb0: 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74  r it may point t
8ec0: 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74  o some static st
8ed0: 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e  orage somewhere.
8ee0: 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
8ef0: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
8f00: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
8f10: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
8f20: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72  ion of .  ** str
8f30: 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68  error_r(), which
8f40: 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61   always writes a
8f50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8f60: 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a  into aErr[]..  *
8f70: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f  *.  ** If the co
8f80: 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61  de incorrectly a
8f90: 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
8fa0: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
8fb0: 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ion that is.  **
8fc0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20   available, the 
8fd0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
8fe0: 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65  ll often be an e
8ff0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74  mpty string. Not
9000: 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f   a.  ** huge pro
9010: 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c  blem. Incorrectl
9020: 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61  y concluding tha
9030: 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  t the GNU versio
9040: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a  n is available .
9050: 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20    ** could lead 
9060: 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68  to a segfault th
9070: 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64  ough..  */.#if d
9080: 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f  efined(STRERROR_
9090: 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66  R_CHAR_P) || def
90a0: 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a  ined(__USE_GNU).
90b0: 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69    zErr = .# endi
90c0: 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69  f.  strerror_r(i
90d0: 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a  Errno, aErr, siz
90e0: 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23  eof(aErr)-1);..#
90f0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  elif SQLITE_THRE
9100: 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73  ADSAFE.  /* This
9110: 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65   is a threadsafe
9120: 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65   build, but stre
9130: 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20  rror_r() is not 
9140: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20  available. */.  
9150: 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65  zErr = "";.#else
9160: 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64  .  /* Non-thread
9170: 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20  safe build, use 
9180: 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20  strerror(). */. 
9190: 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72   zErr = strerror
91a0: 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66  (iErrno);.#endif
91b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ..  assert( errc
91c0: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
91d0: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
91e0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
91f0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
9200: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
9210: 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20  unix.c:%d: (%d) 
9220: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
9230: 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e      iLine, iErrn
9240: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
9250: 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65   zErr.  );..  re
9260: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
9270: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
9280: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
9290: 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
92a0: 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d  that close() alm
92b0: 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73  ost always works
92c0: 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e  , since it is on
92d0: 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20  ly in a.** very 
92e0: 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e  sick application
92f0: 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69   or on a very si
9300: 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74  ck platform that
9310: 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a   it might fail..
9320: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61  ** If it does fa
9330: 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20  il, simply leak 
9340: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
9350: 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20  tor, but do log 
9360: 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a  the.** error..**
9370: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74  .** Note that it
9380: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
9390: 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66  retry close() af
93a0: 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20  ter EINTR since 
93b0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
93c0: 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76  riptor might hav
93d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
93e0: 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72  eused by another
93f0: 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77   thread..** So w
9400: 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79  e don't even try
9410: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
9420: 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74   an EINTR.  Just
9430: 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a   log the error.*
9440: 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a  * and move on..*
9450: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
9460: 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46  bust_close(unixF
9470: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
9480: 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  h, int lineno){.
9490: 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29    if( osClose(h)
94a0: 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   ){.    unixLogE
94b0: 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54  rrorAtLine(SQLIT
94c0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22  E_IOERR_CLOSE, "
94d0: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20  close",.        
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
94f0: 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50  File ? pFile->zP
9500: 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29  ath : 0, lineno)
9510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
9520: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
9530: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
9540: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
9550: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
9560: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
9570: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
9580: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
9590: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
95a0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
95b0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
95c0: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
95d0: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
95e0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
95f0: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
9600: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
9610: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
9620: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f  p->pNext;.    ro
9630: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
9640: 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , p->fd, __LINE_
9650: 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  _);.    sqlite3_
9660: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70  free(p);.  }.  p
9670: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
9680: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
9690: 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65  ease a unixInode
96a0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
96b0: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
96c0: 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65  ted by findInode
96d0: 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Info()..**.** Th
96e0: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
96f0: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
9700: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
9710: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
9720: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
9730: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
9740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9750: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
9760: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
9770: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
9780: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
9790: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
97a0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
97b0: 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
97c0: 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29  ALWAYS(pInode) )
97d0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  {.    pInode->nR
97e0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ef--;.    if( pI
97f0: 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  node->nRef==0 ){
9800: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9810: 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d  Inode->pShmNode=
9820: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 );.      clos
9830: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
9840: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
9850: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20  node->pPrev ){. 
9860: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9870: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
9880: 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ext==pInode );. 
9890: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
98a0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49  Prev->pNext = pI
98b0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
98c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
98d0: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
98e0: 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ist==pInode );. 
98f0: 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74         inodeList
9900: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
9910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9920: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  if( pInode->pNex
9930: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
9940: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  ert( pInode->pNe
9950: 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64  xt->pPrev==pInod
9960: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
9970: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
9980: 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  v = pInode->pPre
9990: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
99a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
99b0: 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  node);.    }.  }
99c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
99d0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
99e0: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
99f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9a00: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
9a10: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
9a20: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
9a30: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
9a40: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
9a50: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
9a60: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
9a70: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
9a80: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
9a90: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
9aa0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
9ab0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
9ac0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
9ad0: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
9ae0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
9af0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
9b00: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
9b10: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
9b20: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
9b30: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
9b40: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
9b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
9b60: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
9b70: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
9b80: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
9b90: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
9ba0: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
9bb0: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
9bc0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
9bd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
9be0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
9c00: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
9c10: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
9c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9c40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9c50: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
9c60: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
9c70: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
9c80: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
9c90: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9ca0: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
9cb0: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
9cc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
9cd0: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
9ce0: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
9cf0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
9d00: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
9d10: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
9d20: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
9d30: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
9d40: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
9d50: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
9d60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
9d70: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
9d80: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
9d90: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
9da0: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
9db0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
9dc0: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
9dd0: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
9de0: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
9df0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  rc!=0 ){.    pFi
9e00: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
9e10: 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f  errno;.#ifdef EO
9e20: 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20  VERFLOW.    if( 
9e30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9e40: 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65  ==EOVERFLOW ) re
9e50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  turn SQLITE_NOLF
9e60: 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  S;.#endif.    re
9e70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9e80: 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  R;.  }..#ifdef _
9e90: 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e  _APPLE__.  /* On
9ea0: 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f   OS X on an msdo
9eb0: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68  s filesystem, th
9ec0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69  e inode number i
9ed0: 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20  s reported.  ** 
9ee0: 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  incorrectly for 
9ef0: 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e  zero-size files.
9f00: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32    See ticket #32
9f10: 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a  60.  To work.  *
9f20: 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  * around this pr
9f30: 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64  oblem (we consid
9f40: 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f  er it a bug in O
9f50: 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29  S X, not SQLite)
9f60: 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20  .  ** we always 
9f70: 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
9f80: 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77  e size to 1 by w
9f90: 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
9fa0: 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20  byte.  ** prior 
9fb0: 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  to accessing the
9fc0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
9fd0: 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69  The one byte wri
9fe0: 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20  tten is.  ** an 
9ff0: 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63  ASCII 'S' charac
a000: 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68  ter which also h
a010: 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
a020: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a   first byte.  **
a030: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
a040: 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64  f every SQLite d
a050: 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69  atabase.  In thi
a060: 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a  s way, if there.
a070: 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63    ** is a race c
a080: 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68  ondition such th
a090: 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  at another threa
a0a0: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  d has already po
a0b0: 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65  pulated.  ** the
a0c0: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
a0d0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
a0e0: 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a  damage is done..
a0f0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62    */.  if( statb
a100: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26  uf.st_size==0 &&
a110: 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73   (pFile->fsFlags
a120: 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47   & SQLITE_FSFLAG
a130: 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29  S_IS_MSDOS)!=0 )
a140: 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f  {.    do{ rc = o
a150: 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20  sWrite(fd, "S", 
a160: 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  1); }while( rc<0
a170: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
a180: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
a190: 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  1 ){.      pFile
a1a0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
a1b0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
a1c0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
a1d0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
a1e0: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
a1f0: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
a200: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
a210: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
a220: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
a230: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
a240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
a250: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  if..  memset(&fi
a260: 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  leId, 0, sizeof(
a270: 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65  fileId));.  file
a280: 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  Id.dev = statbuf
a290: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
a2a0: 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64  VXWORKS.  fileId
a2b0: 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49  .pId = pFile->pI
a2c0: 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49  d;.#else.  fileI
a2d0: 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  d.ino = statbuf.
a2e0: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
a2f0: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
a300: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
a310: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
a320: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
a330: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
a340: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
a350: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
a360: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
a370: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
a380: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
a390: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
a3a0: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
a3b0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
a3c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a3d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a3e0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
a3f0: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
a400: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
a410: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
a420: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
a430: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
a440: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
a450: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
a460: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
a470: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
a480: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
a490: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
a4a0: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
a4b0: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
a4c0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
a4d0: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
a4e0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
a4f0: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
a500: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
a510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a520: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
a530: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
a540: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
a550: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
a560: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
a570: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
a580: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
a590: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
a5a0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
a5b0: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
a5c0: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
a5d0: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
a5e0: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
a5f0: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
a600: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
a610: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
a620: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
a630: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
a640: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
a650: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
a660: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
a670: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
a680: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
a690: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
a6a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
a6b0: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
a6c0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
a6d0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
a6e0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
a6f0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
a700: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
a710: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
a720: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
a730: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
a740: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
a750: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
a760: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
a770: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
a780: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
a790: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
a7a0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
a7b0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
a7c0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
a7d0: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
a7e0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
a7f0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
a800: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
a810: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
a820: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
a830: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
a840: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
a850: 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c  eserved && !pFil
a860: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
a870: 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  essLock ){.    s
a880: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
a890: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
a8a0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
a8b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
a8c0: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
a8d0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
a8e0: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
a8f0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
a900: 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  .    if( osFcntl
a910: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
a920: 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  LK, &lock) ){.  
a930: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a940: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
a950: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  VEDLOCK;.      p
a960: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
a970: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65  = errno;.    } e
a980: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
a990: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
a9a0: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
a9b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
a9c0: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
a9d0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
a9e0: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
a9f0: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
aa00: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
aa10: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
aa20: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
aa30: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
aa40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
aa50: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
aa60: 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e  a system-lock on
aa70: 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e   the file pFile.
aa80: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a    The lock is .*
aa90: 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  * described by p
aaa0: 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Lock..**.** If t
aab0: 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65  he pFile was ope
aac0: 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66  ned read/write f
aad0: 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74  rom unix-excl, t
aae0: 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63  hen the only loc
aaf0: 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e  k.** ever obtain
ab00: 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69  ed is an exclusi
ab10: 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20  ve lock, and it 
ab20: 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63  is obtained exac
ab30: 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  tly once.** the 
ab40: 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c  first time any l
ab50: 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64  ock is attempted
ab60: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
ab70: 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67  t system locking
ab80: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62  .** operations b
ab90: 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c  ecome no-ops.  L
aba0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
abb0: 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  s still happen i
abc0: 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e  nternally,.** in
abd0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69   order to coordi
abe0: 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77  nate access betw
abf0: 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74  een separate dat
ac00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ac10: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  s.** within this
ac20: 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c   process, but al
ac30: 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e  l of that is han
ac40: 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61  dled in memory a
ac50: 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  nd the.** operat
ac60: 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ing system does 
ac70: 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e  not participate.
ac80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
ac90: 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74  tion is a pass-t
aca0: 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28  hrough to fcntl(
acb0: 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c  F_SETLK) if pFil
acc0: 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e  e is using.** an
acd0: 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e  y VFS other than
ace0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20   "unix-excl" or 
acf0: 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e  if pFile is open
ad00: 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c  ed on "unix-excl
ad10: 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64  ".** and is read
ad20: 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  -only..**.** Zer
ad30: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
ad40: 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65   the call comple
ad50: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
ad60: 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c  , or -1 if a cal
ad70: 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20  l.** to fcntl() 
ad80: 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  fails. In this c
ad90: 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65  ase, errno is se
ada0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20  t appropriately 
adb0: 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f  (by fcntl())..*/
adc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
add0: 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  FileLock(unixFil
ade0: 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74  e *pFile, struct
adf0: 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a   flock *pLock){.
ae00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
ae10: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
ae20: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
ae30: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
ae40: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
ae50: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
ae60: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70  !=0 );.  if( ((p
ae70: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
ae80: 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29  & UNIXFILE_EXCL)
ae90: 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62  !=0 || pInode->b
aea0: 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20  ProcessLock).   
aeb0: 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  && ((pFile->ctrl
aec0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
aed0: 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29  _RDONLY)==0).  )
aee0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  {.    if( pInode
aef0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
af00: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
af10: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
af20: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
af30: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  de->nLock==0 );.
af40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
af50: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
af60: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
af70: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
af80: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
af90: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
afa0: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
afb0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
afc0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e        rc = osFcn
afd0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
afe0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
aff0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
b000: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
b010: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
b020: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
b030: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
b040: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b050: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
b060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
b070: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
b080: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
b090: 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck);.  }.  retur
b0a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b0b0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
b0c0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
b0d0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
b0e0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
b0f0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
b100: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
b110: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
b120: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
b130: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
b140: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
b150: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
b160: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
b170: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
b180: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
b190: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
b1a0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
b1b0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
b1c0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
b1d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
b1e0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
b1f0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
b200: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
b210: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
b220: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
b230: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
b240: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
b250: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
b260: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
b270: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
b280: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
b290: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
b2a0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
b2b0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
b2c0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
b2d0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
b2e0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
b2f0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
b300: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
b310: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
b320: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
b330: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
b340: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
b350: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
b360: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
b370: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
b380: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
b390: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
b3a0: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
b3b0: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
b3c0: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
b3d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
b3e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
b3f0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
b400: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
b410: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
b420: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
b430: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
b440: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
b450: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
b460: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
b470: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
b480: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
b490: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
b4a0: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
b4b0: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
b4c0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
b4d0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
b4e0: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
b4f0: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
b500: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
b510: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
b520: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
b530: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
b540: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
b550: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
b560: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
b570: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
b580: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
b590: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
b5a0: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
b5b0: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
b5c0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
b5d0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
b5e0: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
b5f0: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
b600: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
b610: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
b620: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
b630: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
b640: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
b650: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
b660: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
b670: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
b680: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
b690: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
b6a0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
b6b0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
b6c0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
b6d0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
b6e0: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
b6f0: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
b700: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
b710: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
b720: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
b730: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
b740: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
b750: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
b760: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
b770: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
b780: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
b790: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
b7a0: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
b7b0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
b7c0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
b7d0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
b7e0: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
b7f0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
b800: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
b810: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
b820: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
b830: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
b840: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
b850: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
b860: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
b870: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
b880: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
b890: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
b8a0: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
b8b0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
b8c0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
b8d0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
b8e0: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
b8f0: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
b900: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
b910: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
b920: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
b930: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
b940: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
b950: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
b960: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
b970: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
b980: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
b990: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
b9a0: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
b9b0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
b9c0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
b9d0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
b9e0: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
b9f0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
ba00: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
ba10: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
ba20: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
ba30: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
ba40: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
ba50: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
ba60: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
ba70: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
ba80: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
ba90: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
baa0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
bab0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
bac0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
bad0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
bae0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
baf0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
bb00: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
bb10: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
bb20: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
bb30: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
bb40: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
bb50: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
bb60: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
bb70: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
bb80: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
bb90: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
bba0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
bbb0: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
bbc0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
bbd0: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
bbe0: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
bbf0: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
bc00: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
bc10: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
bc20: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
bc30: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
bc40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bc50: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
bc60: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
bc70: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
bc80: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
bc90: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
bca0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
bcb0: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
bcc0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
bcd0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
bce0: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
bcf0: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
bd00: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
bd10: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
bd20: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
bd30: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
bd40: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
bd50: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
bd60: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
bd70: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
bd80: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
bd90: 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
bda0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
bdb0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
bdc0: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
bdd0: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
bde0: 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
bdf0: 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
be00: 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
be10: 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
be20: 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
be30: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
be40: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
be50: 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
be60: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
be70: 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
be80: 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
be90: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
bea0: 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e  lready held) (un
beb0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
bec0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  ,.            az
bed0: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
bee0: 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
bef0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
bf00: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
bf10: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
bf20: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
bf30: 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  ..  **  (1) We n
bf40: 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
bf50: 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
bf60: 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
bf70: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
bf80: 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
bf90: 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
bfa0: 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
bfb0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
bfc0: 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
bfd0: 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
bfe0: 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
bff0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
c000: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
c010: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
c020: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
c030: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c040: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c050: 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
c060: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
c070: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
c080: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
c090: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
c0a0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c0b0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74  ;..  /* This mut
c0c0: 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
c0d0: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
c0e0: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
c0f0: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
c100: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
c110: 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
c120: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
c130: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
c140: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
c150: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
c160: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
c170: 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
c180: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
c190: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
c1a0: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
c1b0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
c1c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c1d0: 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
c1e0: 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20  ock && .        
c1f0: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
c200: 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
c210: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
c220: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
c230: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
c240: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
c250: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
c260: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
c270: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
c280: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
c290: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
c2a0: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
c2b0: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
c2c0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
c2d0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
c2e0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
c2f0: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
c300: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
c310: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
c320: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
c330: 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e  .      (pInode->
c340: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c350: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
c360: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
c370: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
c380: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
c390: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c3a0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
c3b0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
c3c0: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
c3d0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
c3e0: 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
c3f0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
c400: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
c410: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
c420: 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
c430: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
c440: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
c450: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
c460: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
c470: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
c480: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
c490: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
c4a0: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
c4b0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
c4c0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
c4d0: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
c4e0: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
c4f0: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  sed..  */.  lock
c500: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c  .l_len = 1L;.  l
c510: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
c520: 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65  EEK_SET;.  if( e
c530: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
c540: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
c550: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
c560: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
c570: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
c580: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
c590: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
c5a0: 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d  e = (eFileLock==
c5b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
c5c0: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
c5d0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c5e0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
c5f0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
c600: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
c610: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
c620: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
c630: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
c640: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
c650: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
c660: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
c670: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c680: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
c690: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c6a0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
c6b0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
c6c0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
c6d0: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e   }...  /* If con
c6e0: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
c6f0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
c700: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
c710: 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
c720: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
c730: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
c740: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
c750: 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
c760: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c770: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
c780: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
c790: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c7a0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c7b0: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
c7c0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
c7d0: 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  K );..    /* Now
c7e0: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
c7f0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
c800: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
c810: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
c820: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
c830: 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  IZE;.    if( uni
c840: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
c850: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
c860: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
c870: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c880: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
c890: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
c8a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
c8b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c8c0: 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
c8d0: 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
c8e0: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
c8f0: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
c900: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
c910: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63  en = 1L;.    loc
c920: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
c930: 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  CK;.    if( unix
c940: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
c950: 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51  &lock) && rc==SQ
c960: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c970: 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68   /* This could h
c980: 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74  appen with a net
c990: 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20  work mount */.  
c9a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
c9b0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
c9c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
c9d0: 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK; .    }..    
c9e0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c9f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
ca00: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
ca10: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ca20: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
ca30: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
ca40: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  _lock;.    }else
ca50: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
ca60: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
ca70: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
ca80: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
ca90: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
caa0: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
cab0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
cac0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
cad0: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
cae0: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
caf0: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
cb00: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
cb10: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
cb20: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
cb30: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
cb40: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
cb50: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
cb60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
cb70: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
cb80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
cb90: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
cba0: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
cbb0: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
cbc0: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
cbd0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
cbe0: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
cbf0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
cc00: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
cc10: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
cc20: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
cc30: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
cc40: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
cc50: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
cc60: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  ..    assert( eF
cc70: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
cc80: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  D_LOCK || eFileL
cc90: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
cca0: 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OCK );.    if( e
ccb0: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
ccc0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
ccd0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
cce0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
ccf0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
cd00: 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1L;.    }else{
cd10: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
cd20: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
cd30: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
cd40: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
cd50: 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ZE;.    }..    i
cd60: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
cd70: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
cd80: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
cd90: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
cda0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
cdb0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
cdc0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
cdd0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
cde0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
cdf0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
ce00: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ce10: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
ce20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
ce30: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
ce40: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
ce50: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
ce60: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
ce70: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
ce80: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
ce90: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
cea0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
ceb0: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
cec0: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
ced0: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
cee0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
cef0: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
cf00: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
cf10: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
cf20: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
cf30: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
cf40: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
cf50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
cf60: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
cf70: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
cf80: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
cf90: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
cfa0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
cfb0: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
cfc0: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
cfd0: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
cfe0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
cff0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d000: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
d010: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
d020: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
d030: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
d040: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
d050: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
d060: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
d070: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
d080: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
d090: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
d0a0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
d0b0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
d0c0: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
d0d0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
d0e0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
d0f0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
d100: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
d110: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
d120: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
d130: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
d140: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
d150: 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
d160: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
d170: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
d180: 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65  tor used by file
d190: 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f   handle pFile to
d1a0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
d1b0: 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69  ng.** pUnused li
d1c0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
d1d0: 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28  id setPendingFd(
d1e0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
d1f0: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
d200: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
d210: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
d220: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
d230: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  File->pUnused;. 
d240: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f   p->pNext = pIno
d250: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  de->pUnused;.  p
d260: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
d270: 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d   p;.  pFile->h =
d280: 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55   -1;.  pFile->pU
d290: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
d2a0: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
d2b0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
d2c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
d2d0: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
d2e0: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
d2f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
d300: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
d310: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
d320: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
d330: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
d340: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
d350: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
d360: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
d370: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
d380: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d390: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a   a no-op..** .**
d3a0: 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c   If handleNFSUnl
d3b0: 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65  ock is true, the
d3c0: 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67  n on downgrading
d3d0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   an EXCLUSIVE_LO
d3e0: 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20  CK to SHARED.** 
d3f0: 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69  the byte range i
d400: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32  s divided into 2
d410: 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66   parts and the f
d420: 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c  irst part is unl
d430: 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65  ocked then.** se
d440: 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b  t to a read lock
d450: 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72  , then the other
d460: 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20   part is simply 
d470: 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20  unlocked.  This 
d480: 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64  works .** around
d490: 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46   a bug in BSD NF
d4a0: 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65  S lockd (also se
d4b0: 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e  en on MacOSX 10.
d4c0: 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74  3+) that fails t
d4d0: 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o .** remove the
d4e0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61   write lock on a
d4f0: 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72   region when a r
d500: 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e  ead lock is set.
d510: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
d520: 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  osixUnlock(sqlit
d530: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
d540: 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20   eFileLock, int 
d550: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29  handleNFSUnlock)
d560: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
d570: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d580: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
d590: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
d5a0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
d5b0: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
d5c0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
d5d0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
d5e0: 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
d5f0: 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
d600: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
d610: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
d620: 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
d630: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
d640: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
d650: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
d660: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
d670: 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74 70  ared,.      getp
d680: 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  id()));..  asser
d690: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
d6a0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
d6b0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
d6c0: 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
d6d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d6e0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
d6f0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
d700: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
d710: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
d720: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
d730: 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
d740: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d750: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
d760: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d770: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
d780: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d790: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
d7a0: 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
d7b0: 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
d7c0: 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
d7d0: 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
d7e0: 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
d7f0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
d800: 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
d810: 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
d820: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
d830: 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
d840: 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
d850: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d860: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
d870: 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
d880: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
d890: 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
d8a0: 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
d8b0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
d8c0: 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
d8d0: 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
d8e0: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
d8f0: 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
d900: 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
d910: 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
d920: 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
d930: 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
d940: 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
d950: 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
d960: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
d970: 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65      */.    pFile
d980: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
d990: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
d9a0: 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
d9b0: 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
d9c0: 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
d9d0: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
d9e0: 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
d9f0: 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
da00: 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
da10: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
da20: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
da30: 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
da40: 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
da50: 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
da60: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
da70: 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
da80: 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
da90: 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
daa0: 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
dab0: 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
dac0: 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
dad0: 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
dae0: 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
daf0: 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
db00: 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
db10: 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
db20: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
db30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
db40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
db50: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c  APPLE__) || !SQL
db60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
db70: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28  NG_STYLE.      (
db80: 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e  void)handleNFSUn
db90: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
dba0: 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  rt( handleNFSUnl
dbb0: 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  ock==0 );.#endif
dbc0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
dbd0: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
dbe0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
dbf0: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
dc00: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
dc10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
dc20: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
dc30: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
dc40: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
dc50: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  call errors */. 
dc60: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76         off_t div
dc70: 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49  Size = SHARED_SI
dc80: 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ZE - 1;.        
dc90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dca0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
dcb0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
dcc0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
dcd0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dce0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
dcf0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
dd00: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
dd10: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
dd20: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
dd30: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
dd40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
dd50: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
dd60: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
dd70: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
dd80: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
dd90: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
dda0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
ddb0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ddc0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
ddd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dde0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
ddf0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
de00: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
de10: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
de20: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
de30: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
de40: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
de50: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
de60: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
de70: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
de80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
de90: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
dea0: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
deb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
dec0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
ded0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dee0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
def0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
df00: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
df10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
df20: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
df30: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
df40: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
df50: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
df60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
df70: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
df80: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
df90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
dfa0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
dfb0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
dfc0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
dfd0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
dfe0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
dff0: 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
e000: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
e010: 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
e020: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
e030: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
e040: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
e050: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
e060: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e070: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
e080: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
e090: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  CK;.          if
e0a0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
e0b0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
e0c0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e0d0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
e0e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e0f0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
e100: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
e110: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
e120: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
e130: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
e140: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
e150: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
e160: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
e170: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
e180: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e190: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e1a0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e1b0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
e1c0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
e1d0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
e1e0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
e1f0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e200: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e220: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
e230: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
e240: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
e250: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
e260: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
e270: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
e280: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
e290: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
e2a0: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
e2b0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
e2c0: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
e2d0: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
e2e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
e2f0: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
e300: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
e310: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
e320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e330: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
e340: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
e350: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
e360: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
e370: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
e380: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
e390: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
e3a0: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
e3b0: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
e3c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e3d0: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
e3e0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
e3f0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e400: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e410: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e430: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
e440: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e450: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e460: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e470: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
e480: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
e490: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
e4a0: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
e4b0: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
e4c0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
e4d0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e4e0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e4f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
e500: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
e510: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
e520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
e530: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
e540: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  NLOCK;.      pFi
e550: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e560: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74  errno;.      got
e570: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e580: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
e590: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
e5a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
e5b0: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
e5c0: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
e5d0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
e5e0: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
e5f0: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
e600: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
e610: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
e620: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
e630: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e640: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
e650: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
e660: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
e670: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
e680: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e690: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
e6a0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e6b0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e6c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e6d0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
e6e0: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
e6f0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e700: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
e710: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e720: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
e730: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e740: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e750: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
e760: 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  .pFile->lastErrn
e770: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e780: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e790: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
e7a0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
e7b0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
e7c0: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
e7d0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
e7e0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
e7f0: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
e800: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
e810: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
e820: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
e830: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
e840: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
e850: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
e860: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
e870: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
e880: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
e890: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
e8a0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
e8b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
e8c0: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
e8d0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
e8e0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
e8f0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
e900: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
e910: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
e920: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
e930: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
e940: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
e950: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
e960: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
e970: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e980: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e990: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e9a0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e9b0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e9c0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e9d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e9e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e9f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
ea00: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
ea10: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
ea20: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
ea30: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
ea40: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
ea50: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
ea60: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
ea70: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
ea80: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
ea90: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
eaa0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
eab0: 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
eac0: 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
ead0: 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck, 0);.}../*.**
eae0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
eaf0: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
eb00: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
eb10: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
eb20: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
eb30: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
eb40: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
eb50: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
eb60: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
eb70: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
eb80: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
eb90: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
eba0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
ebb0: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
ebc0: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
ebd0: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
ebe0: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
ebf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ec00: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
ec10: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
ec20: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
ec30: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
ec40: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
ec50: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
ec60: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
ec70: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
ec80: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
ec90: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
eca0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ecb0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
ecc0: 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
ecd0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
ece0: 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
ecf0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
ed00: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
ed10: 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
ed20: 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
ed30: 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
ed40: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
ed50: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
ed60: 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
ed70: 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
ed80: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
ed90: 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b      }.    vxwork
eda0: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
edb0: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
edc0: 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a  pFile->pId = 0;.
edd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
ede0: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
edf0: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
ee00: 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ));.  OpenCounte
ee10: 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
ee20: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e  _free(pFile->pUn
ee30: 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28  used);.  memset(
ee40: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
ee50: 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
ee60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ee70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ee80: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
ee90: 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
eea0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
eeb0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
eec0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
eed0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
eee0: 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75  ixFile *)id;.  u
eef0: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
ef00: 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
ef10: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
ef20: 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
ef30: 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
ef40: 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
ef50: 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
ef60: 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
ef70: 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
ef80: 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
ef90: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
efa0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
efb0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
efc0: 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
efd0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
efe0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
eff0: 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
f000: 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
f010: 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
f020: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
f030: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
f040: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
f050: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
f060: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
f070: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
f080: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
f090: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
f0a0: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
f0b0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
f0c0: 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
f0d0: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
f0e0: 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
f0f0: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
f100: 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
f110: 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
f120: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
f130: 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
f140: 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
f150: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
f160: 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
f170: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
f180: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
f190: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
f1a0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
f1b0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
f1c0: 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
f1d0: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
f1e0: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
f1f0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f240: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
f250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f290: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
f2a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2b0: 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
f2c0: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
f2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2e0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
f2f0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
f300: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
f310: 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
f320: 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
f330: 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
f340: 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
f350: 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
f360: 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
f370: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
f380: 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
f390: 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
f3a0: 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
f3b0: 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
f3c0: 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
f3d0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
f3e0: 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
f3f0: 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
f400: 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
f410: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
f420: 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
f430: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
f440: 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
f450: 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
f460: 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
f470: 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
f480: 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
f490: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
f4a0: 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
f4b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
f4c0: 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
f4d0: 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
f4e0: 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
f4f0: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
f500: 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
f510: 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
f520: 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
f530: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
f540: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
f550: 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
f560: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
f570: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
f580: 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
f590: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
f5a0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
f5b0: 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
f5c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
f5d0: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
f5e0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f5f0: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
f600: 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
f610: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
f620: 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
f630: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
f640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
f650: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
f660: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f670: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
f680: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
f690: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
f6a0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
f6b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f6c0: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
f6d0: 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
f6e0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
f6f0: 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
f700: 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
f710: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
f720: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
f730: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f750: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
f760: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
f770: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
f780: 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
f790: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
f7a0: 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
f7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
f7c0: 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
f7d0: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
f7e0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
f7f0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
f800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f840: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
f850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f890: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
f8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f8b0: 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
f8c0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
f8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f8e0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
f8f0: 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
f900: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
f910: 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61   uses the exista
f920: 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
f930: 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
f940: 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
f950: 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
f960: 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
f970: 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
f980: 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
f990: 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
f9a0: 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
f9b0: 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
f9c0: 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
f9d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
f9e0: 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
f9f0: 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
fa00: 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
fa10: 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
fa20: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
fa30: 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
fa40: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
fa50: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
fa60: 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
fa70: 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
fa80: 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
fa90: 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
faa0: 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
fab0: 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
fac0: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
fad0: 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
fae0: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
faf0: 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
fb00: 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
fb10: 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
fb20: 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
fb30: 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
fb40: 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
fb50: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
fb60: 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
fb70: 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
fb80: 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
fb90: 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
fba0: 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
fbb0: 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
fbc0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
fbd0: 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
fbe0: 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
fbf0: 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65  ** The existance
fc00: 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
fc10: 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
fc20: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
fc30: 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
fc40: 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
fc50: 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
fc60: 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
fc70: 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
fc80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
fc90: 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
fca0: 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
fcb0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
fcc0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
fcd0: 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
fce0: 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
fcf0: 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
fd00: 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
fd10: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
fd20: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
fd30: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
fd40: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
fd50: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
fd60: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
fd70: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
fd80: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
fd90: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
fda0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
fdb0: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
fdc0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
fdd0: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
fde0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
fdf0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
fe00: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
fe10: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
fe20: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
fe30: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
fe40: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
fe50: 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
fe60: 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
fe70: 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
fe80: 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
fe90: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
fea0: 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
feb0: 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
fec0: 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
fed0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
fee0: 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
fef0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
ff00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
ff10: 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
ff20: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
ff30: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
ff40: 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
ff50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ff60: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
ff70: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
ff80: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ff90: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
ffa0: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
ffb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
ffc0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
ffd0: 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
ffe0: 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
fff0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
10000 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
10010 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
10020 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
10030 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
10040 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
10050 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
10060 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
10070 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
10080 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
10090 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
100a0 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
100b0 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
100c0 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
100d0 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
100e0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
100f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
10100 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
10110 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
10120 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
10130 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10140 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
10150 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
10160 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10170 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
10180 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
10190 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
101a0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
101b0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
101c0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
101d0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
101e0 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
101f0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
10200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10210 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
10220 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
10230 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
10240 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
10250 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
10260 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
10270 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
10280 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
10290 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
102a0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
102b0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
102c0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
102d0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
102e0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
102f0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
10300 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
10310 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
10320 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
10330 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
10340 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
10350 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
10360 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
10370 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
10380 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
10390 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
103a0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
103b0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
103c0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
103d0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
103e0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
103f0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
10400 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
10410 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
10420 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
10430 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
10440 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
10450 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
10460 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
10470 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
10480 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
10490 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
104a0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
104b0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
104c0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
104d0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
104e0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
104f0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
10500 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
10510 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
10520 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
10530 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
10540 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
10550 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
10560 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
10570 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
10580 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
10590 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
105a0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
105b0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
105c0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
105d0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
105e0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
105f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10600 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10610 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
10620 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
10630 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
10640 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10650 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
10660 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
10670 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
10680 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
10690 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
106a0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
106b0 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
106c0 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
106d0 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
106e0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
106f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
10700 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
10710 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10720 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
10730 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
10740 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
10750 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
10760 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
10770 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
10780 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
10790 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
107a0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
107b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
107c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
107d0 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
107e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
107f0 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
10800 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
10810 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
10820 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
10830 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
10840 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
10850 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
10860 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10870 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
10880 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
10890 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
108a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
108b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
108c0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
108d0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
108e0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
108f0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
10900 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
10910 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
10920 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10940 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10950 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
10960 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
10970 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
10980 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
10990 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
109a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
109b0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
109c0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
109d0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
109e0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
109f0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
10a00 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
10a10 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
10a20 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
10a30 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
10a40 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
10a50 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
10a60 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
10a70 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
10a80 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
10a90 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
10aa0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
10ab0 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
10ac0 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
10ad0 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
10ae0 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
10af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10b00 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
10b10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10b20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
10b30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10b40 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10b50 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
10b60 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
10b70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
10b80 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
10b90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
10ba0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
10bb0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
10bc0 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
10bd0 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
10be0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
10bf0 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
10c00 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
10c10 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
10c20 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
10c30 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
10c40 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
10c50 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10c60 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
10c70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
10c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10c90 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
10ca0 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
10cb0 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
10cc0 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
10cd0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
10ce0 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
10cf0 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
10d00 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
10d10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
10d20 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
10d30 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
10d40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
10d50 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
10d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10d70 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
10d80 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
10d90 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
10da0 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
10db0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
10dc0 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
10dd0 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69  );.  rc = osRmdi
10de0 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  r(zLockFile);.  
10df0 69 66 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  if( rc<0 && errn
10e00 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20  o==ENOTDIR ) rc 
10e10 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b  = osUnlink(zLock
10e20 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c  File);.  if( rc<
10e30 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  0 ){.    int tEr
10e40 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10e50 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28   rc = 0;.    if(
10e60 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
10e70 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
10e80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10e90 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  OCK;.    }.    i
10ea0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
10eb0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
10ec0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10ed0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
10ee0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
10ef0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
10f00 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
10f10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10f20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
10f30 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b  ose a file.  Mak
10f40 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20  e sure the lock 
10f50 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65  has been release
10f60 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67  d before closing
10f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10f80 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  dotlockClose(sql
10f90 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
10fa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
10fb0 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
10fc0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10fd0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
10fe0 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64  dotlockUnlock(id
10ff0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
11000 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
11010 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11020 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  xt);.  }.  rc = 
11030 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
11040 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11050 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
11060 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
11070 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
11080 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
11090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
110b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110f0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
11100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11140 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
11160 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
11170 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
11180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11190 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
111a0 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
111b0 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
111c0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
111d0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
111e0 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
111f0 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
11200 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
11210 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
11220 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
11230 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
11240 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
11250 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
11260 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
11270 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
11280 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
11290 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
112a0 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
112b0 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
112c0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
112d0 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
112e0 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
112f0 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
11300 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
11310 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
11320 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
11330 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
11340 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
11350 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
11360 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
11370 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11380 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
11390 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69   turned off or i
113a0 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66  f.** compiling f
113b0 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23  or VXWORKS..*/.#
113c0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
113d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
113e0 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  & !OS_VXWORKS../
113f0 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
11400 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
11410 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
11420 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
11430 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
11440 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
11450 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
11460 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
11470 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
11480 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
11490 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
114a0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
114b0 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
114c0 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
114d0 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
114e0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
114f0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
11500 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
11510 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
11520 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
11530 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
11540 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
11550 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
11560 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
11570 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
11580 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
11590 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
115a0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
115b0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
115c0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
115d0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
115e0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
115f0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
11600 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
11610 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
11620 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
11630 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11640 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
11650 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
11660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
11670 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
11680 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11690 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
116a0 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
116b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
116c0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
116d0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
116e0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
116f0 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
11700 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
11710 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
11720 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
11730 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
11740 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
11750 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
11760 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
11770 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
11780 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
11790 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
117a0 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
117b0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
117c0 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
117d0 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
117e0 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
117f0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
11800 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
11810 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
11820 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
11830 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
11840 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
11850 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
11860 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
11870 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
11880 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
11890 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
118a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
118b0 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
118c0 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
118d0 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d  */.        lrc =
118e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
118f0 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 69  LOCK; .        i
11900 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11910 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
11920 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11930 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
11940 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
11950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11960 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
11970 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
11980 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
11990 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
119a0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
119b0 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
119c0 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
119d0 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
119e0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
119f0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
11a00 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
11a10 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
11a20 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
11a30 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
11a40 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11a50 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
11a60 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
11a70 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
11a80 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11a90 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
11aa0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
11ab0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
11ac0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11ad0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
11ae0 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
11af0 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
11b00 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
11b10 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
11b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
11b30 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65  served=1;.  }.#e
11b40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
11b50 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
11b60 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52  _ERRORS */.  *pR
11b70 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
11b80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11b90 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
11ba0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
11bb0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
11bc0 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
11bd0 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
11be0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
11bf0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
11c00 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
11c10 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
11c20 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
11c30 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
11c40 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
11c50 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
11c60 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
11c70 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
11c80 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
11c90 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
11ca0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
11cb0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
11cc0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
11cd0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
11ce0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
11cf0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
11d00 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
11d10 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
11d20 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
11d30 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
11d40 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
11d50 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
11d60 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
11d70 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
11d80 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
11d90 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
11da0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
11db0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
11dc0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
11dd0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
11de0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
11df0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
11e00 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
11e10 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11e20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11e30 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
11e40 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
11e50 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
11e60 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
11e70 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
11e80 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
11e90 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
11ea0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
11eb0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
11ec0 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
11ed0 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
11ee0 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
11ef0 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
11f00 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
11f10 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
11f20 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
11f30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11f40 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11f50 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11f60 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11f70 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11f80 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11f90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11fb0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11fc0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11fd0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
11fe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11ff0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12000 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12010 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
12020 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
12030 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
12040 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
12050 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
12060 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
12070 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
12080 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
12090 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
120a0 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
120b0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
120c0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
120d0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
120e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
120f0 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
12100 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
12110 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f    .  if (robust_
12120 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12130 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
12140 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
12150 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12160 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
12170 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
12180 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12190 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
121a0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
121b0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
121c0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
121d0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
121e0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
121f0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
12200 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
12210 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
12220 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
12230 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
12240 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12250 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12260 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
12270 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
12280 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
12290 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
122a0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
122b0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
122c0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
122d0 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
122e0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
122f0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12300 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
12310 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
12320 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12340 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
12350 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
12360 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12370 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
12380 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
12390 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
123a0 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
123b0 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
123c0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
123d0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
123e0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
123f0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
12400 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
12410 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
12420 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
12430 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
12440 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
12450 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
12460 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
12470 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
12480 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
12490 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
124a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
124b0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
124c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
124d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
124e0 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
124f0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
12500 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
12510 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
12520 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
12530 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
12540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
12550 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
12560 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
12570 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
12580 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
12590 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
125a0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
125b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
125c0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
125d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
125e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
125f0 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
12600 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
12610 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
12620 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
12630 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
12640 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
12650 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
12660 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
12670 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
12680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
12690 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
126a0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
126b0 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
126c0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
126d0 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
126e0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
126f0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
12700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12710 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
12720 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12730 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
12740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12750 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
12760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
12770 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
12780 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
12790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
127a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
127b0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
127c0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
127d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
127e0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
127f0 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
12800 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
12810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
12820 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
12830 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
12840 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
12850 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
12860 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
12870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12880 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
12890 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
128a0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
128b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
128c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
12910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
12960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12970 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
12980 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
12990 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
129a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
129b0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
129c0 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
129d0 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
129e0 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
129f0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
12a00 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
12a10 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
12a20 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
12a30 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
12a40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
12a50 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
12a60 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
12a70 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
12a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
12a90 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
12aa0 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
12ab0 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
12ac0 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
12ad0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
12ae0 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
12af0 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
12b00 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
12b10 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
12b20 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
12b30 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
12b40 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
12b50 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
12b60 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
12b70 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
12b80 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
12b90 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
12ba0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
12bb0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
12bc0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
12bd0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
12be0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
12bf0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
12c00 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
12c10 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
12c20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
12c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
12c40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12c50 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12c60 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
12c70 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
12c80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12c90 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
12ca0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12cb0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12cc0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
12cd0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12ce0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12cf0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12d00 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12d10 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
12d20 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
12d30 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
12d40 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
12d50 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12d60 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12d70 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
12d80 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
12d90 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
12da0 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
12db0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
12dc0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
12dd0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
12de0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
12df0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
12e00 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
12e10 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
12e20 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
12e30 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
12e40 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12e50 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
12e60 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
12e70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12e80 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
12e90 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
12ea0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
12eb0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12ec0 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
12ed0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
12ee0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
12ef0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
12f00 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
12f10 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
12f20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
12f30 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
12f40 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
12f50 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
12f60 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
12f70 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
12f80 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
12f90 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
12fa0 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
12fb0 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
12fc0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
12fd0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
12fe0 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
12ff0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
13000 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
13010 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
13020 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
13030 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
13040 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
13050 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
13060 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
13070 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13080 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13090 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
130a0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
130b0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
130c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
130d0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
130e0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
130f0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
13100 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
13110 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
13120 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
13130 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
13140 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
13150 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
13160 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13170 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13180 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13190 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
131a0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
131b0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
131c0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
131d0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
131e0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
131f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
13200 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
13210 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
13220 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
13230 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
13240 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
13250 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
13260 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13270 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13280 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13290 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
132a0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
132b0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
132c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
132d0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
132e0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
132f0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
13300 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
13310 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
13320 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
13330 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
13340 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
13350 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
13360 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
13370 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
13380 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
13390 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
133a0 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
133b0 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
133c0 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
133d0 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
133e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
133f0 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
13400 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
13410 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
13420 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
13430 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
13440 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
13450 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63  tatic int semLoc
13460 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13470 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13480 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
13490 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
134a0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
134b0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
134c0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
134d0 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
134e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
134f0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
13500 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
13510 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
13520 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
13530 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
13540 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
13550 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
13560 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
13570 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13580 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13590 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
135a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
135b0 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
135c0 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
135d0 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
135e0 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
135f0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
13600 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
13610 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
13620 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
13630 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
13640 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
13650 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
13660 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
13670 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
13680 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
13690 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
136a0 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
136b0 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
136c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
136d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
136e0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
136f0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
13700 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
13710 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
13720 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
13730 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13740 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
13750 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
13760 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13770 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
13780 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
13790 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
137a0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
137b0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
137c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
137d0 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
137e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
137f0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13800 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13810 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
13820 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
13830 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
13840 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
13850 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
13860 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
13870 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
13880 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
13890 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
138a0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
138b0 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
138c0 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
138d0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
138e0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
138f0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
13900 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
13910 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13920 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
13930 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
13940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13950 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
13960 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
13970 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
13980 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
13990 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
139a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
139b0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
139c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
139d0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
139e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
139f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
13a00 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
13a10 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
13a20 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
13a30 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
13a40 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13a50 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13a60 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13a70 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13a80 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
13a90 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13aa0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
13ab0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13ac0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
13ad0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
13ae0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
13af0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
13b00 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
13b10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
13b20 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
13b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
13b40 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
13b50 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
13b60 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
13b70 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13b80 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
13b90 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
13ba0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
13bb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
13bc0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
13bd0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
13be0 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
13bf0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
13c00 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  ex();.    closeU
13c10 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
13c20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13c30 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
13c40 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
13c50 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  /*.** Named sema
13c60 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
13c70 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
13c80 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
13ca0 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  nd of the named 
13cb0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69  semaphore lock i
13cc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
13cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
13d30 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
13d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d80 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
13da0 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a  in AFP Locking *
13db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dd0 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68  .**.** AFP is th
13de0 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50  e Apple Filing P
13df0 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73  rotocol.  AFP is
13e00 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73   a network files
13e10 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f  ystem found.** o
13e20 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73  n Apple Macintos
13e30 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f  h computers - bo
13e40 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a  th OS9 and OSX..
13e50 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74  **.** Third-part
13e60 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
13e70 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61  s of AFP are ava
13e80 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69  ilable.  But thi
13e90 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f  s code here.** o
13ea0 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58  nly works on OSX
13eb0 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
13ec0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
13ed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
13ee0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
13ef0 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
13f00 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
13f10 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
13f20 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
13f30 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
13f40 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
13f50 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
13f60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
13f70 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
13f80 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72  ontext {.  int r
13f90 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74  eserved;.  const
13fa0 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
13fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
13fc0 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
13fd0 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ile */.};..struc
13fe0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
13ff0 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
14000 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
14010 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
14020 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
14030 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
14040 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
14050 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
14060 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
14070 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
14080 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14090 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
140a0 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
140b0 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
140c0 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
140d0 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
140e0 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
140f0 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
14100 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
14110 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
14120 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
14130 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
14140 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
14150 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
14160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
14180 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
14190 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
141a0 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
141b0 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
141c0 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
141d0 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
141e0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
141f0 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54  ockPB2)../*.** T
14200 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
14210 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20   for setting or 
14220 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72  clearing a bit-r
14230 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a  ange lock on an.
14240 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  ** AFP filesyste
14250 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  m..** .** Return
14260 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
14270 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55  ccess, SQLITE_BU
14280 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  SY on failure..*
14290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
142a0 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
142b0 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
142c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
142d0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
142e0 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e   be locked or un
142f0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
14300 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
14310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
14320 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
14330 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20  or on path */.  
14340 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
14350 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f  ng offset,     /
14360 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20  * First byte to 
14370 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
14380 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
14390 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a  g length,     /*
143a0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
143b0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
143c0 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20  t setLockFlag   
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
143e0 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b  True to set lock
143f0 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61  .  False to clea
14400 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  r lock */.){.  s
14410 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
14420 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74  ockPB2 pb;.  int
14430 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
14440 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
14450 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
14460 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
14470 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
14480 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
14490 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
144a0 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46  h; .  pb.fd = pF
144b0 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54  ile->h;.  .  OST
144c0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
144d0 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20  K [%s] for %d%s 
144e0 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
144f0 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
14500 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
14510 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
14520 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73  (pb.fd==-1?"[tes
14530 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20  tval-1]":""),.  
14540 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68    offset, length
14550 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  ));.  err = fsct
14560 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
14570 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
14580 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
14590 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
145a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
145b0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
145c0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
145d0 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
145e0 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
145f0 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
14600 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
14610 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
14620 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65  tErrno)));.#ifde
14630 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
14640 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  AFP_LOCK_ERRORS.
14650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14660 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20  BUSY;.#else.    
14670 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
14680 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
14690 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
146a0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
146b0 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f  ckFlag ? SQLITE_
146c0 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c  IOERR_LOCK : SQL
146d0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
146e0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
146f0 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
14700 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
14710 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
14720 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
14730 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14740 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
14750 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
14760 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
14770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14780 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
14790 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
147a0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
147b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
147c0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
147d0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
147e0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
147f0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
14800 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
14810 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
14820 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
14830 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
14840 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
14850 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
14860 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
14870 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
14880 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
14890 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
148a0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
148b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
148c0 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76  t afpCheckReserv
148d0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
148e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
148f0 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
14900 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14910 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
14920 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14930 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14940 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  )id;.  afpLockin
14950 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
14960 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  t;.  .  Simulate
14970 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
14980 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
14990 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
149a0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
149b0 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65  pFile );.  conte
149c0 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
149d0 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
149e0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
149f0 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d  ;.  if( context-
14a00 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  >reserved ){.   
14a10 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20   *pResOut = 1;. 
14a20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14a30 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
14a40 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
14a50 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
14a60 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
14a70 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
14a80 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  /.  .  /* Check 
14a90 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
14aa0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
14ab0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
14ac0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
14ad0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
14ae0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
14af0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
14b00 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
14b10 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
14b20 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
14b30 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
14b40 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
14b50 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
14b60 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
14b70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
14b80 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14b90 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14ba0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
14bb0 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
14bc0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
14bd0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
14be0 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
14bf0 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
14c00 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
14c10 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
14c20 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
14c30 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
14c40 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
14c50 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
14c60 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
14c70 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
14c80 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
14c90 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
14ca0 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
14cb0 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
14cc0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
14cd0 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
14ce0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
14cf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
14d00 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
14d10 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
14d20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
14d30 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
14d40 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
14d50 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14d60 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %d (afp)\n", pF
14d70 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14d80 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52  rved));.  .  *pR
14d90 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
14da0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14db0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
14dc0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
14dd0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
14de0 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
14df0 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
14e00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
14e10 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
14e20 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
14e30 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
14e40 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
14e50 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
14e60 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
14e70 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
14e80 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
14e90 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
14ea0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
14eb0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
14ec0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
14ed0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
14ee0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
14ef0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
14f00 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
14f10 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
14f20 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
14f30 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
14f40 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
14f50 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
14f60 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
14f70 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
14f80 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
14f90 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
14fa0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
14fb0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
14fc0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
14fd0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
14fe0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14ff0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
15000 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
15010 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
15020 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
15030 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
15040 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
15050 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
15060 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
15070 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
15080 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
15090 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
150a0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
150b0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
150c0 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
150d0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
150e0 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33   afpLock(sqlite3
150f0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
15100 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  FileLock){.  int
15110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15120 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15130 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15140 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
15150 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
15160 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
15170 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15180 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
15190 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
151a0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
151b0 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73  Context;.  .  as
151c0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
151d0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
151e0 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
151f0 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %s,%d) pid=%d (a
15200 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
15220 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
15230 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
15240 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
15250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
15260 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e  ileLock(pInode->
15270 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f  eFileLock), pIno
15280 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
15290 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
152a0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
152b0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
152c0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
152d0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
152e0 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
152f0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
15300 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
15310 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
15320 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
15330 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
15340 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
15350 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
15360 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15370 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
15380 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
15390 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
153a0 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
153b0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
153c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
153d0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
153e0 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
153f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15400 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
15410 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
15420 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
15430 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
15440 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
15450 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
15460 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
15470 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
15480 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
15490 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
154a0 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
154b0 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
154c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
154d0 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
154e0 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
154f0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
15500 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
15510 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
15520 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
15530 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
15550 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
15560 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
15570 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
15580 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
15590 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
155a0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
155b0 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
155c0 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
155d0 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
155e0 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
155f0 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
15600 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
15610 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
15620 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
15630 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
15640 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
15650 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
15660 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
15670 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
15680 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
15690 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
156a0 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
156b0 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
156c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
156d0 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
156e0 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28  ock && .       (
156f0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15700 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
15710 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
15720 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20  RED_LOCK)).     
15730 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
15740 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
15750 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15760 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61    }.  .  /* If a
15770 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
15780 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
15790 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
157a0 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
157b0 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
157c0 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
157d0 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
157e0 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
157f0 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
15800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
15810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
15820 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15830 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e  CK && .     (pIn
15840 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
15850 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
15860 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
15870 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
15880 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15890 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
158a0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
158b0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
158c0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
158d0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
158e0 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
158f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15900 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
15910 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
15920 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
15930 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
15940 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
15950 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20  ock;.  }.    .  
15960 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
15970 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
15980 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
15990 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
159a0 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
159b0 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
159c0 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
159d0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
159e0 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
159f0 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
15a00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
15a10 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15a20 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
15a30 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
15a40 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
15a50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
15a60 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
15a70 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
15a80 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
15a90 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15aa0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
15ab0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
15ac0 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
15ad0 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
15ae0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
15af0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
15b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
15b10 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
15b20 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
15b30 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
15b40 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
15b50 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
15b60 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
15b70 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
15b80 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
15b90 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15ba0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15bb0 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  int lrc1, lrc2, 
15bc0 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lrc1Errno = 0;. 
15bd0 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b     long lk, mask
15be0 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72  ;.    .    asser
15bf0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
15c00 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
15c10 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
15c20 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
15c30 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d       .    mask =
15c40 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d   (sizeof(long)==
15c50 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54  8) ? LARGEST_INT
15c60 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b  64 : 0x7fffffff;
15c70 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
15c80 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
15c90 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
15ca0 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
15cb0 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
15cc0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
15cd0 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
15ce0 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
15cf0 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
15d00 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
15d10 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29  te = (lk & mask)
15d20 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
15d30 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
15d40 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15d50 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15d60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
15d70 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
15d80 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
15d90 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
15da0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
15db0 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
15dc0 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
15dd0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
15de0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
15df0 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
15e00 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
15e10 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15e20 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15e30 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
15e40 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
15e50 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15e60 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
15e70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
15e80 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72  tErrno = lrc1Err
15e90 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  no;.      rc = l
15ea0 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
15eb0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
15ec0 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
15ed0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
15ee0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
15ef0 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
15f00 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
15f10 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
15f20 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
15f30 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
15f40 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
15f50 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
15f60 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
15f70 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
15f80 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
15f90 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
15fa0 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
15fb0 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
15fc0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
15fd0 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
15fe0 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
15ff0 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
16000 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
16010 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
16020 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
16030 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20  is.     ** same 
16040 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
16050 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
16060 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
16070 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
16080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
16090 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
160a0 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
160b0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
160c0 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
160d0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
160e0 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
160f0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
16100 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
16110 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
16120 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
16130 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
16140 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
16150 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  leLock );.    if
16160 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52   (eFileLock >= R
16170 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
16180 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16190 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   < RESERVED_LOCK
161a0 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ) {.        /* A
161b0 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
161c0 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  D lock */.      
161d0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
161e0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
161f0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
16200 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
16210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61  );.      if( !fa
16220 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
16230 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
16240 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
16250 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61     }.    if (!fa
16260 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63  iled && eFileLoc
16270 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  k == EXCLUSIVE_L
16280 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
16290 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
162a0 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
162b0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
162c0 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
162d0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
162e0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
162f0 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
16300 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
16310 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
16320 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
16330 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
16340 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
16350 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
16360 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16370 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16380 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
16390 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
163a0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f              pIno
163b0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
163c0 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 0)) ){.      
163d0 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20    int failed2 = 
163e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
163f0 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d     /* now attemm
16400 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78  pt to get the ex
16410 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e  clusive lock ran
16420 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ge */.        fa
16430 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
16440 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16450 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
16460 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
16490 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
164a0 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28   if( failed && (
164b0 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74  failed2 = afpSet
164c0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
164d0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
16500 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72  T + pInode->shar
16510 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29  edByte, 1, 1)) )
16520 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
16530 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68  an't reestablish
16540 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16550 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20  .  Sqlite can't 
16560 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20  deal, this is.  
16570 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69          ** a cri
16580 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a  tical I/O error.
16590 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
165a0 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61         rc = ((fa
165b0 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f  iled & SQLITE_IO
165c0 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
165d0 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20  OERR) ? failed2 
165e0 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  : .             
165f0 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c    SQLITE_IOERR_L
16600 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  OCK;.          g
16610 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16620 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  ;.        } .   
16630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16640 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a    rc = failed; .
16650 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16660 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a    if( failed ){.
16670 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
16680 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  d;.    }.  }.  .
16690 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
166a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
166b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
166c0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
166d0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
166e0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
166f0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
16700 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
16710 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
16720 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
16730 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
16740 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
16750 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
16760 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c    }.  .afp_end_l
16770 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
16780 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
16790 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
167a0 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20  %s %s (afp)\n", 
167b0 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
167c0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
167d0 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
167e0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
167f0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
16800 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16810 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
16820 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
16830 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
16840 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
16850 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
16860 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
16870 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
16880 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
16890 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
168a0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
168b0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
168c0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
168d0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
168e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
168f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16900 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
16910 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63  tic int afpUnloc
16920 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16930 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
16940 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
16950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
16960 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16970 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
16980 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
16990 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
169a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
169b0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
169c0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
169d0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
169e0 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61  t;.  int skipSha
169f0 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  red = 0;.#ifdef 
16a00 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
16a10 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  t h = pFile->h;.
16a20 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
16a30 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
16a40 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
16a50 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
16a60 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
16a70 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
16a80 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
16a90 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16aa0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
16ab0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
16ac0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
16ad0 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
16ae0 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a     getpid()));..
16af0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
16b00 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
16b10 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
16b20 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
16b30 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
16b40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16b50 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
16b60 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
16b70 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
16b80 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
16b90 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
16ba0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16bb0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
16bc0 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
16bd0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
16be0 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
16bf0 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
16c00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16c10 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
16c20 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
16c30 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
16c40 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
16c50 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66  0);.    .#ifndef
16c60 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
16c70 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
16c80 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
16c90 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
16ca0 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
16cb0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
16cc0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
16cd0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
16ce0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
16cf0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
16d00 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
16d10 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
16d20 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
16d30 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
16d40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
16d50 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
16d60 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
16d70 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
16d80 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
16d90 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
16da0 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
16db0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
16dc0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
16dd0 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
16de0 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
16df0 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
16e00 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
16e10 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
16e20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
16e30 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
16e40 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
16e50 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
16e60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
16e70 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
16e80 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
16e90 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
16ea0 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
16eb0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
16ec0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
16ed0 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
16ee0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
16ef0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
16f00 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
16f10 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16f20 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
16f30 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
16f40 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
16f50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16f60 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
16f70 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16f80 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
16f90 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
16fa0 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
16fb0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
16fc0 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
16fd0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
16fe0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
16ff0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
17000 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
17010 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
17020 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17030 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17040 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
17050 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
17060 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
17070 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
17080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17090 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
170a0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
170b0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
170c0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
170d0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
170e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
170f0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
17100 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
17110 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
17120 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
17130 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
17140 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
17150 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
17160 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
17170 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17180 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17190 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
171a0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
171b0 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
171c0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
171d0 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
171e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
171f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17200 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
17210 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
17220 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
17230 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
17240 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
17250 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
17260 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
17270 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
17280 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
17290 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
172a0 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
172b0 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
172c0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
172d0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
172e0 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
172f0 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
17300 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
17310 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
17320 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
17330 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
17340 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
17350 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
17360 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
17370 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
17380 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
17390 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
173a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
173b0 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
173c0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
173d0 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
173e0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
173f0 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
17400 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17410 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
17420 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
17430 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
17440 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17450 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
17460 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
17470 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
17480 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
17490 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
174a0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
174b0 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
174c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
174d0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
174e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
174f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17500 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
17510 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
17520 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
17530 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
17540 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
17550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
17560 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
17570 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
17580 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
17590 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
175a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
175b0 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
175c0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
175d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
175e0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
175f0 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
17600 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
17610 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
17620 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
17630 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
17640 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
17650 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17660 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
17670 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
17680 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
17690 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
176a0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
176b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
176c0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
176d0 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
176e0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
176f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
17700 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
17710 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
17720 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
17730 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
17740 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
17750 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
17760 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
17770 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
17780 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
17790 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
177a0 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
177b0 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
177c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
177d0 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
177e0 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
177f0 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
17800 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
17810 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
17820 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
17830 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
17840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
17850 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
17860 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
17870 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
17880 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
17890 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
178a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
178b0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
178c0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
178d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
178e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
178f0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
17900 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
17910 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17920 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
17930 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
17940 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
17950 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
17960 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
17970 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
17980 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
17990 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
179a0 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
179b0 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
179c0 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
179d0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
179e0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
179f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
17a00 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
17a10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
17a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a30 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
17a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a80 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
17a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ad0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
17ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17af0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
17b00 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
17b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b20 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
17b30 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
17b40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
17b50 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
17b60 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
17b70 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
17b80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
17b90 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
17ba0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
17bb0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
17bc0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
17bd0 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
17be0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
17bf0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
17c00 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
17c10 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
17c20 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
17c30 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
17c40 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
17c50 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
17c60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
17c70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
17c80 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
17c90 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
17ca0 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
17cb0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
17cc0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
17cd0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
17ce0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
17cf0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
17d00 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
17d10 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
17d20 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
17d30 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
17d40 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
17d50 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
17d60 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
17d70 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
17d80 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
17d90 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
17da0 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
17db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17dc0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
17dd0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
17de0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
17df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
17e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
17e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
17ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
17eb0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
17ec0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
17ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
17ef0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
17f00 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
17f10 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
17f20 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
17f30 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
17f40 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
17f50 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
17f60 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
17f70 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
17f80 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
17f90 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
17fa0 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
17fb0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
17fc0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
17fd0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
17fe0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
17ff0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
18000 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
18010 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
18020 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
18030 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
18040 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
18050 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
18060 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
18070 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
18080 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
18090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
180a0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
180b0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
180c0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
180d0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
180e0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
180f0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
18100 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
18110 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
18120 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
18130 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
18140 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
18150 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
18160 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
18170 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
18180 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
18190 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
181a0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
181b0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
181c0 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
181d0 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
181e0 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
181f0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
18200 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
18210 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
18220 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
18230 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
18240 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18260 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
18270 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
18280 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
18290 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
182a0 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
182b0 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30  .  int prior = 0
182c0 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
182d0 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
182e0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
182f0 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
18300 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
18310 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 64 6f  IMER_START;.  do
18320 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  {.#if defined(US
18330 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74  E_PREAD).    got
18340 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68   = osPread(id->h
18350 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
18360 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  set);.    Simula
18370 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
18380 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66   -1 );.#elif def
18390 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
183a0 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72  ).    got = osPr
183b0 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ead64(id->h, pBu
183c0 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
183d0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
183e0 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
183f0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f  ;.#else.    newO
18400 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
18410 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
18420 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75  K_SET);.    Simu
18430 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77  lateIOError( new
18440 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20  Offset-- );.    
18450 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
18460 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
18470 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
18480 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28  -1 ){.        ((
18490 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
184a0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
184b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
184c0 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
184d0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
184e0 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 20 20  o = 0;....      
184f0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  }.      return -
18500 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  1;.    }.    got
18510 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c   = osRead(id->h,
18520 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
18530 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d  dif.    if( got=
18540 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  =cnt ) break;.  
18550 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
18560 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
18570 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31  EINTR ){ got = 1
18580 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20  ; continue; }.  
18590 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20      prior = 0;. 
185a0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
185b0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
185c0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62  = errno;.      b
185d0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  reak;.    }else 
185e0 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20  if( got>0 ){.   
185f0 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20     cnt -= got;. 
18600 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67       offset += g
18610 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ot;.      prior 
18620 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42  += got;.      pB
18630 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74  uf = (void*)(got
18640 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b   + (char*)pBuf);
18650 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
18660 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45   got>0 );.  TIME
18670 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
18680 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20  (("READ    %-3d 
18690 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
186a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
186b0 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c  d->h, got+prior,
186c0 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54   offset-prior, T
186d0 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
186e0 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69    return got+pri
186f0 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  or;.}../*.** Rea
18700 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
18710 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
18720 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
18730 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
18740 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
18750 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
18760 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
18770 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18780 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
18790 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
187a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
187b0 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
187c0 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
187d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
187e0 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69  fset.){.  unixFi
187f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18800 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
18810 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
18820 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   id );..  /* If 
18830 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
18840 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
18850 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
18860 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
18870 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
18880 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
18890 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
188a0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
188b0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
188c0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
188d0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
188e0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
188f0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
18900 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
18910 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
18920 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
18930 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b  if..  got = seek
18940 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f  AndRead(pFile, o
18950 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
18960 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d  );.  if( got==am
18970 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
18980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
18990 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  se if( got<0 ){.
189a0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
189b0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
189c0 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ead */.    retur
189d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
189e0 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
189f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
18a00 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
18a10 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
18a20 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
18a30 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
18a40 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
18a50 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
18a60 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
18a70 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
18a80 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
18a90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
18aa0 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
18ab0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
18ac0 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
18ad0 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
18ae0 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
18af0 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
18b00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
18b10 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
18b20 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
18b30 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   offset..**.** T
18b40 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
18b50 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
18b60 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69   on a failed wri
18b70 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  te the lastErrno
18b80 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
18b90 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18ba0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18bb0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
18bc0 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
18bd0 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
18be0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
18bf0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23  t){.  int got;.#
18c00 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
18c10 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
18c20 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
18c30 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
18c40 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
18c50 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
18c60 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
18c70 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77    do{ got = osPw
18c80 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
18c90 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
18ca0 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
18cb0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
18cc0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
18cd0 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
18ce0 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
18cf0 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
18d00 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68  cnt, offset);}wh
18d10 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18d20 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
18d30 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77  se.  do{.    new
18d40 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69  Offset = lseek(i
18d50 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45  d->h, offset, SE
18d60 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
18d70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
18d80 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20  wOffset-- );.   
18d90 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
18da0 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  offset ){.      
18db0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
18dc0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 28   -1 ){.        (
18dd0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18de0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
18df0 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  o;.      }else{.
18e00 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69          ((unixFi
18e10 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18e20 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 20  no = 0;....     
18e30 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
18e40 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  -1;.    }.    go
18e50 74 20 3d 20 6f 73 57 72 69 74 65 28 69 64 2d 3e  t = osWrite(id->
18e60 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20  h, pBuf, cnt);. 
18e70 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
18e80 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
18e90 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
18ea0 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
18eb0 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
18ec0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18ed0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
18ee0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
18ef0 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
18f00 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
18f10 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
18f20 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
18f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
18f40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
18f50 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
18f60 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
18f70 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
18f80 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
18f90 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
18fa0 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
18fb0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
18fc0 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
18fd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
18fe0 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
18ff0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
19000 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
19010 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
19020 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
19030 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
19040 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
19050 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
19060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
19070 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
19080 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
19090 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
190a0 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
190b0 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
190c0 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
190d0 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
190e0 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
190f0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
19100 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
19110 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
19120 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
19130 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
19140 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
19150 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
19160 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
19170 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
19180 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f..#ifndef NDEBU
19190 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  G.  /* If we are
191a0 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
191b0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
191c0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
191d0 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69  osed to.  ** doi
191e0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
191f0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
19200 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
19210 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
19220 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
19230 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72  ase file) then r
19240 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
19250 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
19260 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65  .  ** has change
19270 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
19280 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
19290 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f  s modified, reco
192a0 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63  rd that.  ** fac
192b0 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  t too..  */.  if
192c0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
192d0 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46  lWrite ){.    pF
192e0 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
192f0 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  1;  /* The datab
19300 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
19310 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  ified */.    if(
19320 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f   offset<=24 && o
19330 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b  ffset+amt>=27 ){
19340 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
19350 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74       char oldCnt
19360 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75  r[4];.      Simu
19370 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
19380 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
19390 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
193a0 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c  le, 24, oldCntr,
193b0 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   4);.      Simul
193c0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
193d0 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  (0);.      if( r
193e0 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f  c!=4 || memcmp(o
193f0 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a  ldCntr, &((char*
19400 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74  )pBuf)[24-offset
19410 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ], 4)!=0 ){.    
19420 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
19430 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f  CntrChng = 1;  /
19440 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
19450 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68  n counter has ch
19460 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d  anged */.      }
19470 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19480 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  f..  while( amt>
19490 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65  0 && (wrote = se
194a0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
194b0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
194c0 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61  amt))>0 ){.    a
194d0 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
194e0 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65   offset += wrote
194f0 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
19500 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
19510 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61  e];.  }.  Simula
19520 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74  teIOError(( wrot
19530 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29  e=(-1), amt=1 ))
19540 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
19550 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74  fullError(( wrot
19560 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a  e=0, amt=1 ));..
19570 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
19580 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26     if( wrote<0 &
19590 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  & pFile->lastErr
195a0 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20  no!=ENOSPC ){.  
195b0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
195c0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
195d0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
195e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
195f0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
19600 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
19610 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
19620 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
19630 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
19640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
19650 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
19660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19670 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
19680 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
19690 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
196a0 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
196b0 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
196c0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
196d0 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
196e0 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
196f0 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74  are occurring at
19700 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
19710 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19720 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
19730 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
19740 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
19750 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
19760 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73  e do not trust s
19770 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64  ystems to provid
19780 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74  e a working fdat
19790 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64  async().  Some d
197a0 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20  o..** Others do 
197b0 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c  no.  To be safe,
197c0 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77   we will stick w
197d0 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c  ith the (slightl
197e0 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79  y slower).** fsy
197f0 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f  nc(). If you kno
19800 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74  w that your syst
19810 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  em does support 
19820 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72  fdatasync() corr
19830 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73  ectly,.** then s
19840 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69  imply compile wi
19850 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66  th -Dfdatasync=f
19860 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20  datasync.*/.#if 
19870 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
19880 6e 63 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61  nc).# define fda
19890 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
198a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
198b0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
198c0 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
198d0 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
198e0 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
198f0 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
19900 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
19910 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
19920 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
19930 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
19940 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
19950 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
19960 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
19970 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
19980 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
19990 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
199a0 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
199b0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
199c0 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
199d0 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
199e0 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
199f0 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
19a00 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
19a10 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
19a20 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
19a30 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
19a40 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
19a50 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
19a60 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
19a70 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
19a80 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
19a90 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
19aa0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
19ab0 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
19ac0 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
19ad0 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
19ae0 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
19af0 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
19b00 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
19b10 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
19b20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
19b30 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
19b40 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
19b50 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
19b60 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
19b70 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
19b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19b90 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
19ba0 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
19bb0 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
19bc0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
19bd0 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
19be0 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
19bf0 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
19c00 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
19c10 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
19c20 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
19c30 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
19c40 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
19c50 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
19c60 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
19c70 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
19c80 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
19c90 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
19ca0 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
19cb0 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
19cc0 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
19cd0 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
19ce0 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
19cf0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
19d00 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
19d10 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
19d20 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
19d30 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
19d40 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
19d50 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
19d60 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
19d70 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
19d80 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
19d90 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
19da0 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
19db0 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
19dc0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
19dd0 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
19de0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
19df0 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
19e00 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
19e10 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
19e20 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
19e30 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
19e40 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
19e50 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
19e60 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
19e70 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
19e80 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
19e90 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
19ea0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
19eb0 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
19ec0 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
19ed0 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
19ee0 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
19ef0 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
19f00 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
19f10 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
19f20 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
19f30 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
19f40 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
19f50 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
19f60 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
19f70 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
19f80 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
19f90 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
19fa0 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
19fb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19fc0 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
19fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
19fe0 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
19ff0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1a000 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a010 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1a020 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1a030 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
1a040 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1a050 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a060 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1a070 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
1a080 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1a090 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1a0a0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1a0b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
1a0c0 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
1a0d0 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
1a0e0 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
1a0f0 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
1a100 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
1a110 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
1a120 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
1a130 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
1a140 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
1a150 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
1a160 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
1a170 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1a180 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
1a190 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
1a1a0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
1a1b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
1a1c0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
1a1d0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
1a1e0 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
1a1f0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
1a200 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
1a210 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
1a220 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1a230 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
1a240 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
1a250 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1a260 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1a270 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
1a280 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1a290 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
1a2a0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1a2b0 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1a2c0 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1a2d0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1a2e0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1a2f0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1a300 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1a310 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1a320 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1a330 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1a340 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1a350 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1a360 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1a370 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1a380 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1a390 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1a3a0 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1a3b0 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1a3c0 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1a3d0 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1a3e0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1a3f0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1a400 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1a410 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1a420 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1a430 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1a440 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1a450 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1a460 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1a470 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1a480 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1a490 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1a4a0 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1a4b0 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1a4c0 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1a4d0 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1a4e0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1a4f0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1a500 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1a510 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1a520 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1a530 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1a540 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1a550 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1a560 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1a570 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1a580 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1a590 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1a5a0 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1a5b0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1a5c0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1a5d0 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1a5e0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1a5f0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1a600 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1a610 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1a620 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1a630 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1a640 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a650 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1a660 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1a670 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1a680 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1a690 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1a6a0 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1a6b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1a6c0 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1a6d0 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1a6e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1a6f0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1a700 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1a710 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1a720 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1a730 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1a740 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1a750 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1a760 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1a770 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1a780 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1a790 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1a7a0 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1a7b0 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1a7c0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1a7d0 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1a7e0 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1a7f0 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1a800 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1a810 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1a820 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1a830 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1a840 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1a850 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1a860 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1a870 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a880 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1a890 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1a8a0 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1a8b0 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1a8c0 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1a8d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1a8e0 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1a8f0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1a900 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1a910 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1a920 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1a930 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1a940 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1a950 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1a960 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1a970 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1a980 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1a990 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1a9a0 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1a9b0 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1a9c0 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1a9d0 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1a9e0 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1a9f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1aa00 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1aa10 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1aa20 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1aa30 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1aa40 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1aa50 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1aa60 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1aa70 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1aa80 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1aa90 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1aaa0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1aab0 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1aac0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1aad0 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1aae0 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1aaf0 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1ab00 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1ab10 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1ab20 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1ab30 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1ab40 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1ab50 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1ab60 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1ab70 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
1ab80 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1ab90 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1aba0 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1abb0 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
1abc0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
1abd0 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
1abe0 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
1abf0 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  ;.    if( fd>=0 
1ac00 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  ){.#ifdef FD_CLO
1ac10 45 58 45 43 0a 20 20 20 20 20 20 6f 73 46 63 6e  EXEC.      osFcn
1ac20 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
1ac30 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
1ac40 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
1ac50 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
1ac60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
1ac70 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1ac80 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29  , fd, zDirname))
1ac90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1aca0 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72  Fd = fd;.  retur
1acb0 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f  n (fd>=0?SQLITE_
1acc0 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  OK:unixLogError(
1acd0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1ace0 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44  BKPT, "open", zD
1acf0 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  irname));.}../*.
1ad00 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1ad10 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1ad20 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1ad30 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1ad40 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1ad50 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1ad60 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1ad70 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1ad80 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1ad90 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1ada0 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1adb0 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1adc0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1add0 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1ade0 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1adf0 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1ae00 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1ae10 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1ae20 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1ae30 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1ae40 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1ae50 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1ae60 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1ae70 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
1ae80 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
1ae90 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
1aea0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
1aeb0 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
1aec0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1aed0 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
1aee0 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
1aef0 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
1af00 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
1af10 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
1af20 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
1af30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
1af40 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
1af50 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1af60 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1af70 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
1af80 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
1af90 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1afa0 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
1afb0 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
1afc0 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
1afd0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
1afe0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
1aff0 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1b000 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
1b010 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
1b020 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1b030 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
1b040 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
1b050 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
1b060 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
1b070 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
1b080 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
1b090 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1b0a0 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
1b0b0 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
1b0c0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
1b0d0 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
1b0e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
1b0f0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1b100 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
1b110 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
1b120 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1b130 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
1b140 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
1b150 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
1b160 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1b170 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
1b180 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
1b190 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
1b1a0 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
1b1b0 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
1b1c0 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
1b1d0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1b1e0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1b1f0 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
1b200 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1b210 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
1b220 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
1b230 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
1b240 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
1b250 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
1b260 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
1b270 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1b280 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
1b290 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1b2a0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1b2b0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1b2c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1b2d0 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75  IOERR_FSYNC, "fu
1b2e0 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65  ll_fsync", pFile
1b2f0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ->zPath);.  }.. 
1b300 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74   /* Also fsync t
1b310 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1b320 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  taining the file
1b330 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20   if the DIRSYNC 
1b340 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1b350 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65  .  This is a one
1b360 2d 74 69 6d 65 20 6f 63 63 75 72 72 61 6e 63 65  -time occurrance
1b370 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20  .  Many systems 
1b380 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a  (examples: AIX).
1b390 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20    ** are unable 
1b3a0 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63  to fsync a direc
1b3b0 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20  tory, so ignore 
1b3c0 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73  errors on the fs
1b3d0 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ync..  */.  if( 
1b3e0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1b3f0 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53   & UNIXFILE_DIRS
1b400 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  YNC ){.    int d
1b410 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43  irfd;.    OSTRAC
1b420 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28  E(("DIRSYNC %s (
1b430 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1b440 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1b450 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ", pFile->zPath,
1b460 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1b470 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1b480 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72  ullsync));.    r
1b490 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  c = osOpenDirect
1b4a0 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ory(pFile->zPath
1b4b0 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
1b4c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b4d0 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a   && dirfd>=0 ){.
1b4e0 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63        full_fsync
1b4f0 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20  (dirfd, 0, 0);. 
1b500 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1b510 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20  e(pFile, dirfd, 
1b520 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
1b530 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1b540 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
1b550 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b560 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1b570 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1b580 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
1b590 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74  RSYNC;.  }.  ret
1b5a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b5b0 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
1b5c0 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
1b5d0 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
1b5e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
1b5f0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
1b600 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
1b610 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  e){.  unixFile *
1b620 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1b630 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  e *)id;.  int rc
1b640 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
1b650 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
1b660 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1b670 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1b680 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  CATE );..  /* If
1b690 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
1b6a0 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
1b6b0 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
1b6c0 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
1b6d0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
1b6e0 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
1b6f0 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
1b700 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
1b710 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
1b720 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
1b730 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
1b740 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
1b750 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1b760 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
1b770 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1b780 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20  ->szChunk ){.   
1b790 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
1b7a0 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
1b7b0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
1b7c0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1b7d0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
1b7e0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75  rc = robust_ftru
1b7f0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1b800 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20  (off_t)nByte);. 
1b810 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1b820 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1b830 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1b840 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1b850 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1b860 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1b870 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1b880 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1b890 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1b8a0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1b8b0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1b8c0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1b8d0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1b8e0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67   to.    ** doing
1b8f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1b900 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1b910 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1b920 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20  other than a.   
1b930 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
1b940 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65  ase file) and we
1b950 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1b960 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1b970 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65  h,.    ** that e
1b980 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74  ffectively updat
1b990 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  es the change co
1b9a0 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67  unter.  This mig
1b9b0 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a  ht happen.    **
1b9c0 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20   when restoring 
1b9d0 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  a database using
1b9e0 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
1b9f0 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  from a zero-leng
1ba00 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65  th.    ** source
1ba10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ba20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1ba30 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d  Write && nByte==
1ba40 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
1ba50 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1ba60 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1ba70 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  f..    return SQ
1ba80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
1ba90 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
1baa0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1bab0 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
1bac0 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
1bad0 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73  t unixFileSize(s
1bae0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1baf0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1bb00 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
1bb10 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
1bb20 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
1bb30 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78  = osFstat(((unix
1bb40 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
1bb50 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
1bb60 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1bb70 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1bb80 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1bb90 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1bba0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1bbb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1bbc0 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
1bbd0 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
1bbe0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
1bbf0 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
1bc00 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
1bc10 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
1bc20 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
1bc30 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
1bc40 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
1bc50 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
1bc60 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
1bc70 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
1bc80 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
1bc90 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
1bca0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
1bcb0 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
1bcc0 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
1bcd0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
1bce0 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
1bcf0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
1bd00 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
1bd10 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
1bd20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
1bd30 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
1bd40 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
1bd50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1bd60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1bd70 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1bd80 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1bd90 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
1bda0 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
1bdb0 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
1bdc0 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
1bdd0 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
1bde0 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
1bdf0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
1be00 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
1be10 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1be20 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
1be30 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
1be40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1be50 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
1be60 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
1be70 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
1be80 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
1be90 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c   operation.  Enl
1bea0 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73  arge the databas
1beb0 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73  e to nBytes in s
1bec0 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20  ize.** (rounded 
1bed0 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  up to the next c
1bee0 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20  hunk-size).  If 
1bef0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1bf00 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65  already.** nByte
1bf10 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69  s or larger, thi
1bf20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1bf30 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1bf40 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
1bf50 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1bf60 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
1bf70 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1bf80 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34  unk>0 ){.    i64
1bf90 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
1bfa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1bfb0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1bfc0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
1bfd0 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
1bfe0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1bff0 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c   hold return val
1c000 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a  ues of fstat() *
1c010 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73  /.   .    if( os
1c020 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
1c030 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53  &buf) ) return S
1c040 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1c050 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  T;..    nSize = 
1c060 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73  ((nByte+pFile->s
1c070 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c  zChunk-1) / pFil
1c080 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1c090 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1c0a0 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34    if( nSize>(i64
1c0b0 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a  )buf.st_size ){.
1c0c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
1c0d0 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1c0e0 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
1c0f0 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20  _FALLOCATE.     
1c100 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c   /* The code bel
1c110 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74  ow is handling t
1c120 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1c130 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29  of osFallocate()
1c140 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65   .      ** corre
1c150 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c  ctly. posix_fall
1c160 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e  ocate() is defin
1c170 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a  ed to "returns z
1c180 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
1c190 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20  .      ** or an 
1c1a0 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20  error number on 
1c1b0 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74   failure". See t
1c1c0 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64  he manpage for d
1c1d0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1c1e0 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20   int err;.      
1c1f0 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20  do{.        err 
1c200 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46  = osFallocate(pF
1c210 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73  ile->h, buf.st_s
1c220 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73  ize, nSize-buf.s
1c230 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  t_size);.      }
1c240 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54  while( err==EINT
1c250 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  R );.      if( e
1c260 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rr ) return SQLI
1c270 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1c280 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49  #else.      /* I
1c290 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f  f the OS does no
1c2a0 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c  t have posix_fal
1c2b0 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69  locate(), fake i
1c2c0 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20 20  t. First use.   
1c2d0 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28     ** ftruncate(
1c2e0 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c  ) to set the fil
1c2f0 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69  e size, then wri
1c300 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  te a single byte
1c310 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
1c320 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61   last byte in ea
1c330 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  ch block within 
1c340 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67  the extended reg
1c350 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20  ion. This.      
1c360 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74  ** is the same t
1c370 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79  echnique used by
1c380 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d   glibc to implem
1c390 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ent posix_falloc
1c3a0 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ate().      ** o
1c3b0 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  n systems that d
1c3c0 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61  o not have a rea
1c3d0 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79  l fallocate() sy
1c3e0 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20  stem call..     
1c3f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
1c400 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73  lk = buf.st_blks
1c410 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79  ize;  /* File-sy
1c420 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20  stem block size 
1c430 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72  */.      i64 iWr
1c440 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1c450 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66       /* Next off
1c460 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  set to write to 
1c470 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f  */..      if( ro
1c480 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1c490 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20  File->h, nSize) 
1c4a0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1c4b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1c4c0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
1c4d0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1c4e0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1c4f0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1c500 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1c510 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1c520 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66    iWrite = ((buf
1c530 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c  .st_size + 2*nBl
1c540 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c  k - 1)/nBlk)*nBl
1c550 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  k-1;.      while
1c560 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29  ( iWrite<nSize )
1c570 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57  {.        int nW
1c580 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rite = seekAndWr
1c590 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74  ite(pFile, iWrit
1c5a0 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  e, "", 1);.     
1c5b0 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1c5c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c5d0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1c5e0 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20        iWrite += 
1c5f0 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nBlk;.      }.#e
1c600 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
1c610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c620 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
1c630 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
1c640 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
1c650 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
1c660 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
1c670 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
1c680 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1c690 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
1c6a0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1c6b0 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
1c6c0 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
1c6d0 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
1c6e0 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
1c6f0 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
1c700 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
1c710 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
1c720 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
1c730 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1c740 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1c750 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1c760 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1c770 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1c780 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1c790 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1c7a0 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1c7b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1c7c0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1c7d0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1c7e0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1c7f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1c800 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1c810 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
1c820 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1c830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1c840 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
1c850 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1c860 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1c870 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
1c880 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1c890 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
1c8a0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1c8b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1c8c0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1c8d0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1c8e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
1c8f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c900 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c910 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
1c920 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
1c930 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1c940 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1c950 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c970 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c980 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
1c990 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
1c9a0 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
1c9b0 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
1c9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c9d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c9e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1c9f0 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
1ca00 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69  int rc;.      Si
1ca10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ca20 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1ca30 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74   = fcntlSizeHint
1ca40 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29  (pFile, *(i64 *)
1ca50 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d  pArg);.      Sim
1ca60 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ca70 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74  gn(0);.      ret
1ca80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ca90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1caa0 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
1cab0 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
1cac0 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
1cad0 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
1cae0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
1caf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1cb00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1cb10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1cb20 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TL_POWERSAFE_OVE
1cb30 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  RWRITE: {.      
1cb40 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
1cb50 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  e, UNIXFILE_PSOW
1cb60 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
1cb70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1cb80 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1cb90 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1cba0 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
1cbb0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1cbc0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
1cbd0 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d  ntf("%s", pFile-
1cbe0 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pVfs->zName);. 
1cbf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1cc00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
1cc10 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1cc20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
1cc30 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
1cc40 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
1cc50 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
1cc60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
1cc70 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1cc80 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
1cc90 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
1cca0 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
1ccb0 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
1ccc0 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
1ccd0 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
1cce0 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
1ccf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1cd00 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1cd10 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
1cd20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1cd30 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
1cd40 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1cd50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1cd60 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1cd70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1cd80 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1cd90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1cda0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
1cdb0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1cdc0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1cdd0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
1cde0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
1cdf0 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
1ce00 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
1ce10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1ce20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1ce30 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1ce40 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1ce50 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  _) */.  }.  retu
1ce60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
1ce70 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
1ce80 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
1ce90 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
1cea0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
1ceb0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
1cec0 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
1ced0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
1cee0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
1cef0 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
1cf00 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
1cf10 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
1cf20 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
1cf30 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
1cf40 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
1cf50 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
1cf60 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
1cf70 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
1cf80 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
1cf90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
1cfa0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
1cfb0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
1cfc0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
1cfd0 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
1cfe0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
1cff0 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
1d000 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
1d010 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
1d020 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1d030 46 69 6c 65 29 7b 0a 20 20 28 76 6f 69 64 29 70  File){.  (void)p
1d040 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  File;.  return S
1d050 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1d060 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
1d070 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1d080 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1d090 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69  stics for the fi
1d0a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56  le..**.** This V
1d0b0 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20  FS is set up to 
1d0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d0d0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1d0e0 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75  ERWRITE by defau
1d0f0 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  lt..** However, 
1d100 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63  that choice is c
1d110 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69 6e  ontraversial sin
1d120 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74  ce technically t
1d130 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
1d140 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65   file system doe
1d150 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f  s not always pro
1d160 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f  vide powersafe o
1d170 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20  verwrites.  (In 
1d180 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
1d190 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f  after a power-lo
1d1a0 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20  ss event, parts 
1d1b0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  of the file that
1d1c0 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77   were never.** w
1d1d0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64  ritten might end
1d1e0 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65   up being altere
1d1f0 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f  d.)  However, no
1d200 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20  n-PSOW behavior 
1d210 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79  is very,.** very
1d220 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65   rare.  And asse
1d230 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73  rting PSOW makes
1d240 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69   a large reducti
1d250 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74  on in the amount
1d260 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20  .** of required 
1d270 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69  I/O for journali
1d280 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20  ng, since a lot 
1d290 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c  of padding is el
1d2a0 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65  iminated..**  He
1d2b0 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52  nce, while POWER
1d2c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69  SAFE_OVERWRITE i
1d2d0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c  s on by default,
1d2e0 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65   there is a file
1d2f0 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69  -control.** avai
1d300 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
1d310 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65   off and URI que
1d320 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61  ry parameter ava
1d330 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
1d340 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  t off..*/.static
1d350 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
1d360 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1d370 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1d380 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
1d390 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1d3a0 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c  .  if( p->ctrlFl
1d3b0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
1d3c0 53 4f 57 20 29 7b 0a 20 20 20 20 72 65 74 75 72  SOW ){.    retur
1d3d0 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  n SQLITE_IOCAP_P
1d3e0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1d3f0 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
1d400 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
1d410 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d420 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1d430 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1d440 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1d450 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1d460 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1d470 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1d480 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1d490 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1d4a0 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1d4b0 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1d4c0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1d4d0 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1d4e0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1d4f0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1d500 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1d510 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1d520 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1d530 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1d540 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1d550 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1d560 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1d570 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1d580 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1d590 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1d5a0 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1d5b0 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1d5c0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1d5d0 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1d5e0 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1d5f0 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1d600 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1d610 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1d620 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1d630 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1d640 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1d650 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1d660 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1d670 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1d680 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1d690 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1d6a0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1d6b0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1d6c0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1d6d0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1d6e0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1d6f0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1d700 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1d710 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1d720 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1d730 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1d740 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1d750 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1d760 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1d770 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1d780 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1d790 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1d7a0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1d7b0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1d7c0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1d7d0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1d7e0 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1d7f0 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1d800 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1d810 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1d820 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1d830 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1d840 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1d850 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1d860 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1d870 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1d880 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1d890 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1d8a0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1d8b0 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1d8c0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1d8d0 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1d8e0 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1d8f0 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1d900 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1d910 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1d920 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1d930 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1d940 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1d950 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1d960 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1d970 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1d9a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1d9b0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d9d0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1d9e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1d9f0 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da10 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1da20 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
1da30 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
1da40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1da50 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
1da60 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
1da70 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1da80 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
1da90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1daa0 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
1dab0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1dac0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dad0 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
1dae0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1daf0 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
1db00 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1db10 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
1db20 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1db30 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
1db40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1db50 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
1db60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db70 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1db80 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1db90 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
1dba0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1dbb0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
1dbc0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
1dbd0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbf0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
1dc00 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
1dc10 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1dc20 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
1dc30 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
1dc40 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
1dc50 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
1dc60 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
1dc70 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
1dc80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1dc90 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1dca0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1dcb0 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
1dcc0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1dcd0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
1dce0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
1dcf0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
1dd00 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
1dd10 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
1dd20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
1dd30 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
1dd40 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
1dd50 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
1dd60 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
1dd70 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
1dd80 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
1dd90 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
1dda0 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
1ddb0 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
1ddc0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1ddd0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1dde0 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
1ddf0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1de00 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
1de10 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1de20 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
1de30 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de50 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
1de60 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1de70 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
1de80 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1de90 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
1dea0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1deb0 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
1dec0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
1ded0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1dee0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1def0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1df00 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
1df10 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1df20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1df30 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1df40 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
1df50 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
1df60 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
1df70 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
1df80 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
1df90 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
1dfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
1dfb0 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
1dfc0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
1dfd0 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
1dfe0 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
1dff0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
1e000 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
1e010 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
1e020 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
1e030 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
1e040 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
1e050 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
1e060 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
1e070 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
1e080 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
1e090 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
1e0a0 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
1e0b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1e0c0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1e0d0 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  (.  unixShmNode 
1e0e0 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70  *pShmNode, /* Ap
1e0f0 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
1e100 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
1e110 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
1e120 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
1e130 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
1e140 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
1e150 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
1e160 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1e170 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
1e180 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
1e190 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
1e1a0 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
1e1b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e1c0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
1e1d0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
1e1e0 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
1e1f0 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
1e200 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
1e210 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
1e220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e230 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1e240 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
1e250 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
1e260 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
1e270 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
1e280 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
1e290 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
1e2a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e2b0 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
1e2c0 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
1e2d0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
1e2e0 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
1e2f0 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
1e300 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
1e310 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1e320 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
1e330 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
1e340 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
1e350 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
1e360 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
1e370 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
1e380 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
1e390 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
1e3a0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
1e3b0 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
1e3c0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
1e3d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
1e3e0 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
1e3f0 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
1e400 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
1e410 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
1e420 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
1e430 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
1e440 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
1e450 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
1e460 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
1e470 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
1e480 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
1e490 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
1e4a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
1e4b0 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
1e4c0 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
1e4d0 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
1e4e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
1e4f0 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
1e500 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
1e510 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  );.  mask = (1<<
1e520 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
1e530 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
1e540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e550 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1e560 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
1e570 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
1e580 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1e590 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e5a0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1e5b0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1e5c0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1e5d0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
1e5e0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
1e5f0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
1e600 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
1e610 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
1e620 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1e630 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1e640 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1e650 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1e660 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e680 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
1e690 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
1e6a0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
1e6b0 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
1e6c0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1e6d0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1e6e0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1e6f0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1e700 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1e710 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1e720 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1e730 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
1e740 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
1e750 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
1e760 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
1e770 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1e780 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1e790 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1e7a0 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
1e7b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1e7c0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
1e7d0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
1e7e0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
1e7f0 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
1e800 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
1e810 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1e820 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
1e830 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
1e840 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1e850 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
1e860 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
1e870 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1e880 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
1e890 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75     .}.../*.** Pu
1e8a0 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
1e8b0 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1e8c0 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1e8d0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
1e8e0 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
1e8f0 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
1e900 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1e910 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
1e920 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
1e930 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
1e940 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1e950 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
1e960 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
1e970 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
1e980 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1e990 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
1e9a0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
1e9b0 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
1e9c0 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
1e9d0 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
1e9e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e9f0 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
1ea00 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
1ea10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1ea20 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
1ea30 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
1ea40 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
1ea50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1ea60 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1ea70 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65    munmap(p->apRe
1ea80 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
1ea90 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
1eaa0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1eab0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1eac0 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
1ead0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1eae0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1eaf0 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
1eb00 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1eb10 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
1eb20 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
1eb30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
1eb40 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
1eb50 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1eb60 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
1eb70 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
1eb80 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1eb90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
1eba0 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
1ebb0 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
1ebc0 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
1ebd0 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1ebe0 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
1ebf0 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
1ec00 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
1ec10 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
1ec20 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
1ec30 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
1ec40 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
1ec50 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
1ec60 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
1ec70 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
1ec80 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
1ec90 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
1eca0 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
1ecb0 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
1ecc0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1ecd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1ece0 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
1ecf0 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
1ed00 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
1ed10 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
1ed20 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
1ed30 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
1ed40 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
1ed50 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
1ed60 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
1ed70 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
1ed80 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
1ed90 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
1eda0 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
1edb0 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
1edc0 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
1edd0 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
1ede0 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
1edf0 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
1ee00 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ee10 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
1ee20 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
1ee30 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
1ee40 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
1ee50 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
1ee60 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
1ee70 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
1ee80 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
1ee90 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
1eea0 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
1eeb0 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
1eec0 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
1eed0 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
1eee0 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
1eef0 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
1ef00 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
1ef10 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
1ef20 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
1ef30 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
1ef40 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
1ef50 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
1ef60 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
1ef70 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
1ef80 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
1ef90 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
1efa0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
1efb0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1efc0 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
1efd0 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
1efe0 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
1eff0 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
1f000 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
1f010 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
1f020 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
1f030 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1f040 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
1f050 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
1f060 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
1f070 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
1f080 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
1f090 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
1f0a0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
1f0b0 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
1f0c0 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
1f0d0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
1f0e0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
1f0f0 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
1f100 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
1f110 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
1f120 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
1f130 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1f140 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
1f150 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
1f160 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
1f170 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
1f180 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
1f190 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
1f1a0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
1f1b0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
1f1c0 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
1f1d0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
1f1e0 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
1f1f0 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
1f200 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
1f210 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1f220 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
1f230 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
1f240 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
1f250 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
1f260 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
1f270 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
1f280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f290 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
1f2a0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1f2b0 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
1f2c0 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
1f2d0 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
1f2e0 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
1f2f0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
1f300 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
1f310 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
1f320 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
1f330 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
1f340 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
1f350 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
1f360 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
1f370 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
1f380 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1f390 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
1f3a0 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
1f3b0 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
1f3c0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1f3d0 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
1f3e0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
1f3f0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1f400 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
1f410 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1f420 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1f430 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f450 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1f460 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1f470 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
1f480 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
1f490 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
1f4a0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
1f4b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1f4c0 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
1f4d0 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
1f4e0 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f500 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
1f510 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
1f520 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
1f530 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1f540 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
1f550 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
1f560 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1f570 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1f580 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1f590 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1f5a0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1f5b0 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
1f5c0 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
1f5d0 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
1f5e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
1f5f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1f600 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
1f610 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
1f620 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
1f630 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
1f640 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
1f650 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
1f660 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1f670 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
1f680 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
1f690 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
1f6a0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
1f6b0 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
1f6c0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1f6d0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
1f6e0 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
1f6f0 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
1f700 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1f710 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
1f720 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
1f730 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
1f740 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f750 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
1f760 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
1f770 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
1f780 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
1f790 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
1f7a0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
1f7b0 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
1f7c0 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70 65  s. The actual pe
1f7d0 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 66 69  rmissions the fi
1f7e0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 20 20  le is created.  
1f7f0 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20 73 75    ** with are su
1f800 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 75 72  bject to the cur
1f810 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74 74 69  rent umask setti
1f820 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ng..    */.    i
1f830 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64  f( osFstat(pDbFd
1f840 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20  ->h, &sStat) && 
1f850 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
1f860 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
1f870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1f880 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20  RR_FSTAT;.      
1f890 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1f8a0 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  r;.    }..#ifdef
1f8b0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1f8c0 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
1f8d0 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
1f8e0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1f8f0 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73  TORY) + 31;.#els
1f900 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
1f910 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74  me = 6 + (int)st
1f920 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  rlen(pDbFd->zPat
1f930 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
1f940 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
1f950 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
1f960 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
1f970 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
1f980 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1f990 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f9a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f9b0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1f9c0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
1f9d0 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
1f9e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
1f9f0 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e  mNode)+nShmFilen
1fa00 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69  ame);.    zShmFi
1fa10 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64  lename = pShmNod
1fa20 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
1fa30 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
1fa40 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
1fa50 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
1fa60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1fa70 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
1fa80 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
1fa90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1faa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
1fab0 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
1fac0 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
1fad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fae0 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
1faf0 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
1fb00 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
1fb10 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
1fb20 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
1fb30 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
1fb40 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
1fb50 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1fb60 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
1fb70 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
1fb80 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
1fb90 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
1fba0 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
1fbb0 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
1fbc0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1fbd0 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
1fbe0 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
1fbf0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
1fc00 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1fc10 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1fc20 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1fc30 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
1fc40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1fc50 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
1fc60 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1fc70 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1fc80 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1fc90 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
1fca0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
1fcb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
1fcc0 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
1fcd0 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20   | O_CREAT;.    
1fce0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
1fcf0 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
1fd00 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
1fd10 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20  y_shm", 0) ){.  
1fd20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
1fd30 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
1fd40 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
1fd50 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
1fd60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
1fd70 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74  Node->h = robust
1fd80 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61  _open(zShmFilena
1fd90 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28  me, openFlags, (
1fda0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
1fdb0 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
1fdc0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
1fdd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
1fde0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1fdf0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1fe00 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
1fe10 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1fe20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1fe30 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
1fe40 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
1fe50 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
1fe60 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75  as root, make su
1fe70 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20  re that the SHM 
1fe80 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  file.      ** is
1fe90 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61   owned by the sa
1fea0 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e  me user that own
1feb0 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
1fec0 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77  atabase.  Otherw
1fed0 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ise,.      ** th
1fee0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72  e original owner
1fef0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
1ff00 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 20 49 66  e to connect. If
1ff10 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
1ff20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 72 6f  .      ** not ro
1ff30 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot, the followin
1ff40 67 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20  g fchown() will 
1ff50 66 61 69 6c 2c 20 62 75 74 20 77 65 20 64 6f 6e  fail, but we don
1ff60 27 74 20 63 61 72 65 2e 0a 20 20 20 20 20 20 2a  't care..      *
1ff70 2f 0a 20 20 20 20 20 20 66 63 68 6f 77 6e 28 70  /.      fchown(p
1ff80 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61  ShmNode->h, sSta
1ff90 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e  t.st_uid, sStat.
1ffa0 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20  st_gid);.  .    
1ffb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1ffc0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
1ffd0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
1ffe0 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
1fff0 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  tch..      ** If
20000 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
20010 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
20020 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a  length. .      *
20030 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
20040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
20050 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  ( unixShmSystemL
20060 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
20070 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
20080 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f  DMS, 1)==SQLITE_
20090 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
200a0 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
200b0 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
200c0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
200d0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
200e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
200f0 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61  HMOPEN, "ftrunca
20100 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  te", zShmFilenam
20110 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
20120 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20140 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
20150 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
20160 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
20170 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
20180 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
20190 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
201a0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
201b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
201c0 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
201d0 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
201e0 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
201f0 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
20200 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
20210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20220 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
20230 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
20240 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
20250 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
20260 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
20270 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
20280 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
20290 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
202a0 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
202b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
202c0 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
202d0 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
202e0 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
202f0 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
20300 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
20310 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
20320 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
20330 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
20340 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
20350 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
20360 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
20370 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
20380 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
20390 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
203a0 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
203b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
203c0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
203d0 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
203e0 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
203f0 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
20400 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
20410 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
20420 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
20430 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
20440 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
20450 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
20460 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
20470 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
20480 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
20490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
204a0 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
204b0 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
204c0 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
204d0 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
204e0 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
204f0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
20500 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
20510 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
20520 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
20530 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
20540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20550 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20560 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
20570 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
20580 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
20590 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
205a0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
205b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
205c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
205d0 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
205e0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
205f0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
20600 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
20610 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
20620 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
20630 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
20640 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
20650 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
20660 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
20670 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
20680 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
20690 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
206a0 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
206b0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
206c0 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
206d0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
206e0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
206f0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
20700 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
20710 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
20720 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
20730 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
20740 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
20750 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
20760 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
20770 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
20780 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
20790 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
207a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
207b0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
207c0 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
207d0 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
207e0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
207f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
20800 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
20810 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
20820 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
20830 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
20840 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
20850 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
20860 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
20870 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
20880 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
20890 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
208a0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
208b0 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
208c0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
208d0 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
208e0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
208f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
20900 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20910 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
20920 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
20930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
20940 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
20950 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
20960 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20980 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
20990 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
209a0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
209b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
209c0 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
209d0 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
20a00 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
20a10 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
20a20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
20a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
20a40 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
20a50 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
20a60 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
20a70 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
20a80 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
20a90 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20aa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20ab0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
20ac0 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
20ad0 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
20ae0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
20af0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
20b00 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
20b10 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
20b20 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
20b30 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
20b40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20b50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
20b60 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
20b70 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
20b80 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
20b90 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
20ba0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
20bb0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
20bc0 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
20bd0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
20be0 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
20bf0 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61  Region==0 );.  a
20c00 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
20c10 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
20c20 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
20c30 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
20c40 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
20c50 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
20c60 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
20c70 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
20c80 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
20c90 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
20ca0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
20cb0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
20cc0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68  Region ){.    ch
20cd0 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20  ar **apNew;     
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e   /* New apRegion
20d00 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
20d10 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
20d20 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
20d30 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
20d40 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
20d50 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
20d60 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
20d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
20d80 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f  ed by fstat() */
20d90 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
20da0 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
20db0 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ion;..    if( pS
20dc0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
20dd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
20de0 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
20df0 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
20e00 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
20e10 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
20e20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f       ** Check to
20e30 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
20e40 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
20e50 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
20e60 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
20e70 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
20e80 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
20e90 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
20ea0 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  on)..      */.  
20eb0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
20ec0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53  pShmNode->h, &sS
20ed0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tat) ){.        
20ee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
20ef0 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20  R_SHMSIZE;.     
20f00 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
20f10 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  out;.      }.  .
20f20 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e        if( sStat.
20f30 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b  st_size<nByte ){
20f40 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
20f50 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
20f60 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
20f70 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65   exist. If bExte
20f80 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  nd is set to.   
20f90 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65       ** false, e
20fa0 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
20fb0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
20fc0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
20fd0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
20fe0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
20ff0 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
21000 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72  if bExtend is tr
21010 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ue, use ftruncat
21020 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
21030 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
21040 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
21050 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  region..        
21060 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
21070 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73  bExtend ) goto s
21080 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
21090 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
210a0 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
210b0 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a  e->h, nByte) ){.
210c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
210d0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
210e0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
210f0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20  , "ftruncate",. 
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
21120 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
21130 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
21140 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
21150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21160 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
21170 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
21180 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
21190 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
211a0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
211b0 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
211c0 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
211d0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
211e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
211f0 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
21200 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
21210 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
21220 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
21230 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
21240 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
21250 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
21260 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
21270 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
21280 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
21290 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
212a0 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20  n<=iRegion){.   
212b0 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
212c0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
212d0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
212e0 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30     pMem = mmap(0
212f0 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20  , szRegion,.    
21300 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
21310 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
21320 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
21330 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
21340 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
21350 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
21360 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d  de->h, pShmNode-
21370 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  >nRegion*szRegio
21380 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
21390 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
213a0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
213b0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
213c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
213d0 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d  IOERR_SHMMAP, "m
213e0 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  map", pShmNode->
213f0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
21400 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
21410 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
21420 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
21430 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71         pMem = sq
21440 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52  lite3_malloc(szR
21450 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
21460 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
21470 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21480 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21490 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
214a0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
214b0 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
214c0 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
214d0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
214e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
214f0 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
21500 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b  nRegion] = pMem;
21510 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21520 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
21530 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
21540 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
21550 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
21560 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  ion ){.    *pp =
21570 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
21580 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  ion[iRegion];.  
21590 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
215a0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   0;.  }.  if( pS
215b0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
215c0 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ly && rc==SQLITE
215d0 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54  _OK ) rc = SQLIT
215e0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71  E_READONLY;.  sq
215f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
21600 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
21610 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
21620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
21630 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
21640 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
21650 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a  ory segment..**.
21660 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
21670 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
21680 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64  tween SHAREd and
21690 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
216a0 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20   is a little.** 
216b0 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74  different here t
216c0 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49  han in posix.  I
216d0 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e  n xShmLock(), on
216e0 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e  e can go from un
216f0 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61  locked.** to sha
21700 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20  red and back or 
21710 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
21720 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62   exclusive and b
21730 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61  ack.  But one ma
21740 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d  y.** not go from
21750 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75   shared to exclu
21760 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63  sive or from exc
21770 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64  lusive to shared
21780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21790 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  unixShmLock(.  s
217a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
217b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
217c0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
217d0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
217e0 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
217f0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
21800 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
21810 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
21820 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
21830 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
21840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21850 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
21860 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
21870 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
218a0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
218b0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
218c0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
218d0 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43  e*)fd;      /* C
218e0 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
218f0 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
21900 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20  */.  unixShm *p 
21910 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
21920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21930 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
21940 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
21950 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20    unixShm *pX;  
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
21980 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
21990 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e  siblings */.  un
219a0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
219b0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
219c0 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  e;  /* The under
219d0 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65  lying file iNode
219e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
219f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
21a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21a10 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
21a20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  u16 mask;       
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a40 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
21a50 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f   locks to take o
21a60 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20  r release */..  
21a70 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
21a80 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
21a90 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
21aa0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
21ab0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
21ac0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
21ad0 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
21ae0 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
21af0 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
21b00 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
21b10 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
21b20 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
21b30 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
21b40 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
21b50 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
21b60 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
21b70 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
21b80 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
21b90 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
21ba0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
21bb0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
21bc0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
21bd0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
21be0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
21bf0 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
21c00 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
21c10 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
21c20 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61  USIVE)!=0 );.  a
21c30 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
21c40 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
21c50 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
21c60 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
21c70 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
21c80 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
21c90 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
21ca0 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  k==0 );..  mask 
21cb0 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
21cc0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61  - (1<<ofst);.  a
21cd0 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
21ce0 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
21cf0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21d00 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
21d10 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
21d20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
21d30 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
21d40 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
21d50 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
21d60 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
21d70 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
21d80 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
21d90 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
21da0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
21db0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
21dc0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
21dd0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
21de0 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
21df0 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
21e00 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
21e10 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
21e20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
21e30 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
21e40 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
21e50 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
21e60 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
21e70 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
21e80 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
21e90 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
21ea0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
21eb0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
21ec0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e  k(pShmNode, F_UN
21ed0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
21ee0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
21ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21f00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21f10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
21f20 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
21f30 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
21f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21f50 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
21f60 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
21f70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
21f80 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
21f90 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
21fa0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
21fb0 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
21fc0 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
21fd0 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
21fe0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
21ff0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
22000 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
22010 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
22020 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
22030 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
22040 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
22050 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
22060 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
22070 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
22080 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
22090 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
220a0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
220b0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
220c0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
220d0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
220e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
220f0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
22100 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
22110 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22120 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
22130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22140 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
22150 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
22160 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
22170 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
22180 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
22190 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
221a0 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
221b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
221c0 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
221d0 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
221e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
221f0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
22200 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
22210 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  DLCK, ofst+UNIX_
22220 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
22230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22240 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
22250 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
22260 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
22270 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
22280 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
22290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
222a0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
222b0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
222c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
222d0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
222e0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
222f0 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
22300 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
22310 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
22320 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
22330 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
22340 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
22350 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
22360 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
22370 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
22380 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
22390 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
223a0 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
223b0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
223c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
223d0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
223e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
223f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22400 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
22410 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
22420 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
22430 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
22440 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
22450 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
22460 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
22470 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
22480 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
22490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
224a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
224b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
224c0 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
224d0 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
224e0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
224f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22500 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
22510 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
22520 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
22530 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
22540 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
22550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
22560 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
22570 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
22580 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
22590 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
225a0 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
225b0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
225c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
225d0 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68   getpid(), p->sh
225e0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
225f0 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72  lMask));.  retur
22600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
22610 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
22620 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
22630 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
22640 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
22650 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
22660 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
22670 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
22680 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
22690 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
226a0 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
226b0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
226c0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
226d0 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69  oid unixShmBarri
226e0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
226f0 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
22700 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
22710 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
22720 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
22730 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
22740 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
22750 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
22760 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
22770 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
22780 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
22790 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
227a0 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
227b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
227c0 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
227d0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
227e0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
227f0 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   no shared memor
22800 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
22810 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  h the connection
22820 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
22830 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c  utine is a harml
22840 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  ess no-op..*/.st
22850 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
22860 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
22870 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
22880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22890 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
228a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
228b0 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
228d0 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d   Delete shared-m
228e0 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f  emory if true */
228f0 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  .){.  unixShm *p
22900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
22920 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
22930 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  osed */.  unixSh
22940 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
22950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22960 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
22970 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
22980 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70  /.  unixShm **pp
22990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229a0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
229b0 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
229c0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
229d0 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
229e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229f0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
22a00 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
22a10 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
22a20 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
22a30 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
22a40 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
22a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22a60 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
22a70 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73  pShmNode;..  ass
22a80 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
22a90 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
22aa0 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
22ab0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
22ac0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
22ad0 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d  ode );..  /* Rem
22ae0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
22af0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
22b00 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
22b10 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
22b20 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
22b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
22b40 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
22b50 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
22b60 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
22b70 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
22b80 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
22b90 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
22ba0 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
22bb0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
22bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
22bd0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
22be0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
22bf0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
22c00 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
22c10 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
22c20 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
22c30 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
22c40 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
22c50 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
22c60 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
22c70 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
22c80 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
22c90 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
22ca0 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
22cb0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
22cc0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
22cd0 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74  ){.    if( delet
22ce0 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64  eFlag && pShmNod
22cf0 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69  e->h>=0 ) osUnli
22d00 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  nk(pShmNode->zFi
22d10 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69  lename);.    uni
22d20 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
22d30 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
22d40 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
22d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22d60 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ...#else.# defin
22d70 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20  e unixShmMap    
22d80 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
22d90 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
22da0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72  efine unixShmBar
22db0 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
22dc0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30  unixShmUnmap   0
22dd0 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
22de0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
22df0 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  AL */../*.** Her
22e00 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
22e10 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
22e20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
22e30 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
22e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e50 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
22e60 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
22e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
22e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ed0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
22ee0 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
22ef0 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
22f00 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  ons of sqlite3_i
22f10 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
22f20 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d  s that.** implem
22f30 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65  ent various file
22f40 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
22f50 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f  ies.  It also co
22f60 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
22f70 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72  ns.** of "finder
22f80 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20  " functions.  A 
22f90 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
22fa0 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
22fb0 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
22fc0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f  e.** sqlite3_io_
22fd0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66  methods object f
22fe0 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
22ff0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
23000 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20  The pAppData.** 
23010 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
23020 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a  ite3_vfs VFS obj
23030 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c  ects are initial
23040 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  ized to be point
23050 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f  ers to.** the co
23060 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e  rrect finder-fun
23070 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56  ction for that V
23080 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66  FS..**.** Most f
23090 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  inder functions 
230a0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
230b0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
230c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
230d0 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f  * object.  The o
230e0 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20  nly interesting 
230f0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
23100 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  is autolockIoFin
23110 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f  der, which.** lo
23120 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
23130 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74  ystem type and t
23140 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68  ries to guess th
23150 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a  e best locking.*
23160 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20  * strategy from 
23170 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  that..**.** For 
23180 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46  finder-funtion F
23190 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72  , two objects ar
231a0 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  e created:.**.**
231b0 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c      (1) The real
231c0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
231d0 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22   named "FImpt()"
231e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41  ..**.**    (2) A
231f0 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65   constant pointe
23200 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  r to this functi
23210 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46  on named just "F
23220 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  "..**.**.** A po
23230 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70  inter to the F p
23240 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61  ointer is used a
23250 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76  s the pAppData v
23260 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20  alue for VFS.** 
23270 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76  objects.  We hav
23280 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73  e to do this ins
23290 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20  tead of letting 
232a0 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a  pAppData point.*
232b0 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68  * directly at th
232c0 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
232d0 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65  n since C90 rule
232e0 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64  s prevent a void
232f0 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73  *.** from be cas
23300 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f  t into a functio
23310 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  n pointer..**.**
23320 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63  .** Each instanc
23330 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20  e of this macro 
23340 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62  generates two ob
23350 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  jects:.**.**   *
23360 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c    A constant sql
23370 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23380 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48  object call METH
23390 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  OD that has lock
233a0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68  ing.**      meth
233b0 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ods CLOSE, LOCK,
233c0 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f   UNLOCK, CKRESLO
233d0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  CK..**.**   *  A
233e0 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e  n I/O method fin
233f0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  der function cal
23400 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20  led FINDER that 
23410 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
23420 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  r.**      to the
23430 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69   METHOD object i
23440 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  n the previous b
23450 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ullet..*/.#defin
23460 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44  e IOMETHODS(FIND
23470 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53  ER, METHOD, VERS
23480 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  ION, CLOSE, LOCK
23490 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b  , UNLOCK, CKLOCK
234a0 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20  )      \.static 
234b0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
234c0 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20  _methods METHOD 
234d0 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  = {             
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49        \.   VERSI
23500 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ON,             
23510 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
23520 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c       \.   CLOSE,
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23560 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
23570 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23590 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61      \.   unixRea
235a0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
235b0 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74     \.   unixWrit
235f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23600 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63    \.   unixTrunc
23640 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
23650 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
23660 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23680 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20   \.   unixSync, 
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20    /* xSync */   
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  \.   unixFileSiz
236e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
236f0 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23720 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20  .   LOCK,       
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  /* xLock */     
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23770 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20     UNLOCK,      
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23790 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20  * xUnlock */    
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
237c0 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20    CKLOCK,       
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
237e0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
237f0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
23800 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23810 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
23820 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23830 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20  xFileControl */ 
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23860 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20  unixSectorSize, 
23870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23880 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20  SectorSize */   
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
238b0 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
238c0 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
238d0 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65  eviceCapabilitie
238e0 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
238f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
23900 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  ixShmMap,       
23910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
23920 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  mMap */         
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
23950 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  xShmLock,       
23960 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
23970 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
239a0 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
239b0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
239c0 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20  arrier */       
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
239f0 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20  hmUnmap         
23a00 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
23a10 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  map */          
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20       \.};       
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
23a90 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
23aa0 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49  thods *FINDER##I
23ab0 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mpl(const char *
23ac0 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b  z, unixFile *p){
23ad0 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41     \.  UNUSED_PA
23ae0 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53  RAMETER(z); UNUS
23af0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45    \.  return &ME
23b30 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20  THOD;           
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20   \.}            
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bc0 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
23bd0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23be0 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45  s *(*const FINDE
23bf0 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  R)(const char*,u
23c00 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c  nixFile *p)    \
23c10 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49  .    = FINDER##I
23c20 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  mpl;../*.** Here
23c30 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20   are all of the 
23c40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23c50 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  ds objects for e
23c60 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ach of the.** lo
23c70 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
23c80 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61  .  Functions tha
23c90 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  t return pointer
23ca0 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f  s to these metho
23cb0 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63  ds.** are also c
23cc0 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54  reated..*/.IOMET
23cd0 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46  HODS(.  posixIoF
23ce0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
23cf0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23d00 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
23d10 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20  osixIoMethods,  
23d20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
23d30 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
23d40 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
23d50 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
23d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
23d70 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e  red memory is en
23d80 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
23d90 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
23da0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
23db0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
23dc0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23dd0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
23de0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
23df0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
23e00 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
23e10 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
23e20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23e30 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
23e40 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
23e50 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
23e60 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64  (.  nolockIoFind
23e70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
23e80 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
23e90 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
23ea0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
23eb0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
23ec0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
23ed0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
23f00 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
23f10 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
23f20 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
23f30 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
23f40 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
23f50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23f60 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
23f70 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
23f80 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23f90 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
23fa0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
23fb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
23fc0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
23fd0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
23fe0 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
23ff0 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
24000 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
24010 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
24020 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49  me */.  dotlockI
24030 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
24040 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
24050 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
24060 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
24090 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
240a0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73  */.  dotlockClos
240b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
240c0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
240d0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  */.  dotlockLock
240e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
240f0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
24100 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  /.  dotlockUnloc
24110 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
24120 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
24130 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63  */.  dotlockChec
24140 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f  kReservedLock  /
24150 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
24160 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
24170 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
24180 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24190 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
241a0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
241b0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
241c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
241d0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
241e0 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
241f0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
24200 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
24210 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
24220 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
24250 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
24260 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
24270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24280 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
24290 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
242a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
242b0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
242c0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
242d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
242e0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
242f0 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
24300 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
24310 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
24320 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
24330 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
24340 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
24350 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
24360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24370 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
24380 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
24390 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
243a0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
243b0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
243c0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
243f0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
24400 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20   */.  semClose, 
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24420 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
24430 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20   */.  semLock,  
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
24460 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20  */.  semUnlock, 
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24480 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
24490 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65   */.  semCheckRe
244a0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
244b0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
244c0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
244d0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
244e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
244f0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
24500 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
24510 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
24520 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
24530 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
24540 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
24550 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
24560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24570 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24580 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
24590 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245b0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
245c0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
245d0 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
245e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
245f0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
24600 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
24610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
24620 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
24630 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
24640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
24650 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
24660 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
24670 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
24680 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
24690 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
246a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
246b0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
246c0 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
246d0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
246e0 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
246f0 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
24700 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
24710 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
24720 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
24730 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
24740 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
24750 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
24760 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
24770 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
24780 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
24790 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
247a0 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
247b0 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
247c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
247d0 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
247e0 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
247f0 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
24800 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
24810 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
24820 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24830 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
24840 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
24850 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
24860 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
24870 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
24880 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
24890 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
248a0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
248b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
248c0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
248d0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
248e0 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
248f0 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
24900 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
24910 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
24920 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
24930 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
24940 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
24950 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
24960 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
24970 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
24980 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
24990 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
249a0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
249b0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
249c0 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
249d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
249e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
249f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a10 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
24a20 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
24a30 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
24a40 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
24a50 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
24a60 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
24a70 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24a80 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
24a90 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
24aa0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24ab0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
24ac0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
24ad0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
24ae0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
24af0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
24b00 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  */.).#endif../* 
24b10 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58  nfs lockd on OSX
24b20 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63   10.3+ doesn't c
24b30 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73  lear write locks
24b40 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
24b50 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20  k is set */.#if 
24b60 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24b70 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
24b80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24b90 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  E.IOMETHODS(.  n
24ba0 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fsIoFinder,     
24bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
24bc0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
24bd0 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68  e */.  nfsIoMeth
24be0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
24bf0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
24c00 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
24c10 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
24c40 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
24c50 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
24c80 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ca0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
24cb0 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b  d */.  nfsUnlock
24cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24cd0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
24ce0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
24cf0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
24d00 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
24d10 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
24d20 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
24d30 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
24d40 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
24d50 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24d60 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
24d70 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
24d80 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
24d90 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
24da0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
24db0 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
24dc0 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
24dd0 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
24de0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
24df0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
24e00 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
24e10 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
24e20 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
24e30 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
24e40 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
24e50 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
24e60 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
24e70 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
24e80 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
24e90 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
24ea0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
24eb0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
24ec0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
24ed0 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
24ee0 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
24ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24f00 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
24f10 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
24f20 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
24f30 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
24f40 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
24f50 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
24f60 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
24f70 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
24f80 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
24f90 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
24fa0 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
24fb0 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
24fc0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
24fd0 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
24fe0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
24ff0 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
25000 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
25010 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
25020 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
25030 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
25040 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
25050 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
25060 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
25070 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
25080 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
25090 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
250a0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
250b0 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
250c0 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
250d0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
250e0 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
250f0 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
25100 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
25110 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
25120 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
25130 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
25140 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
25150 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
25160 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
25170 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
25180 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
25190 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
251a0 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
251b0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
251c0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
251d0 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
251e0 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
251f0 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
25200 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
25210 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
25220 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
25230 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
25240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
25250 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
25260 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
25270 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
25280 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
25290 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
252a0 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
252b0 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
252c0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
252d0 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
252e0 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
252f0 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
25300 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
25310 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
25320 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
25330 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
25340 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
25350 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
25360 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
25370 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
25380 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
25390 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
253a0 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
253b0 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
253c0 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
253d0 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
253e0 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
253f0 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20  , "nfs")==0 ){. 
25400 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73       return &nfs
25410 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
25420 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
25430 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
25440 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  hods;.    }.  }e
25450 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
25460 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
25470 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
25480 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
25490 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
254a0 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
254b0 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
254c0 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
254d0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
254e0 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
254f0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
25500 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
25510 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
25520 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58  LE */..#if OS_VX
25530 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f  WORKS && SQLITE_
25540 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25550 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
25560 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
25570 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
25580 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
25590 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
255a0 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
255b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
255c0 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
255d0 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
255e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
255f0 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
25600 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
25610 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
25620 54 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f  This is for VXWo
25630 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rks only..*/.sta
25640 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
25650 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
25660 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
25670 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
25680 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
25690 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
256a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
256b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
256c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
256d0 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
256e0 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  t */.){.  struct
256f0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
25700 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
25710 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
25720 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
25730 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
25740 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
25750 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
25760 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
25770 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
25780 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
25790 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
257a0 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hods;.  }..  /* 
257b0 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20  Test if fcntl() 
257c0 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64  is supported and
257d0 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65   use POSIX style
257e0 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68   locks..  ** Oth
257f0 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b  erwise fall back
25800 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65   to the named se
25810 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a  maphore method..
25820 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
25830 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
25840 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
25850 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
25860 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
25870 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
25880 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
25890 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
258a0 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
258b0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
258c0 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70   {.    return &p
258d0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
258e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
258f0 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  rn &semIoMethods
25900 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
25910 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
25920 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
25930 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
25940 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
25950 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61  *,unixFile*) = a
25960 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
25970 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
25980 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
25990 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
259a0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
259b0 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20  .** An abstract 
259c0 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74  type for a point
259d0 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f  er to a IO metho
259e0 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
259f0 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f  n:.*/.typedef co
25a00 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
25a10 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72  ethods *(*finder
25a20 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61  _type)(const cha
25a30 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a  r*,unixFile*);..
25a40 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
25a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
25a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
25ab0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
25ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
25ae0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
25af0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
25b00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
25b10 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
25b20 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
25b30 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ject..*/../*.** 
25b40 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
25b50 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75  ontents of the u
25b60 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
25b70 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
25b80 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pId..*/.static i
25b90 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
25ba0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
25bb0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
25bc0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
25bd0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68  bject */.  int h
25be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25bf0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
25c00 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
25c10 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
25c20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
25c30 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20  e *pId,      /* 
25c40 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69  Write to the uni
25c50 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
25c60 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
25c70 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
25c80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25c90 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
25ca0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  ed */.  int ctrl
25cb0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
25cc0 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  /* Zero or more 
25cd0 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65  UNIXFILE_* value
25ce0 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
25cf0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
25d00 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
25d10 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
25d20 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
25d30 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
25d40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
25d50 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49  assert( pNew->pI
25d60 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20  node==NULL );.. 
25d70 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20   /* Usually the 
25d80 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73  path zFilename s
25d90 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72  hould not be a r
25da0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
25db0 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70  . The.  ** excep
25dc0 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65  tion is when ope
25dd0 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22  ning the proxy "
25de0 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62  conch" file in b
25df0 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20  uilds that.  ** 
25e00 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63  include the spec
25e10 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e  ial Apple lockin
25e20 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23  g styles..  */.#
25e30 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
25e40 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
25e50 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25e60 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a  TYLE.  assert( z
25e70 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
25e80 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
25e90 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70   .    || pVfs->p
25ea0 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29  AppData==(void*)
25eb0 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
25ec0 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73  r );.#else.  ass
25ed0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
25ee0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
25ef0 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66  ]=='/' );.#endif
25f00 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e  ..  /* No lockin
25f10 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70  g occurs in temp
25f20 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20  orary files */. 
25f30 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
25f40 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c  me!=0 || (ctrlFl
25f50 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
25f60 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20  OLOCK)!=0 );..  
25f70 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20  OSTRACE(("OPEN  
25f80 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
25f90 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
25fa0 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  pNew->h = h;.  p
25fb0 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  New->pVfs = pVfs
25fc0 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20  ;.  pNew->zPath 
25fd0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70  = zFilename;.  p
25fe0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d  New->ctrlFlags =
25ff0 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a   (u8)ctrlFlags;.
26000 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
26010 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c  i_boolean(((ctrl
26020 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
26030 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d  _URI) ? zFilenam
26040 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20  e : 0),.        
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54     "psow", SQLIT
26070 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
26080 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e  WRITE) ){.    pN
26090 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
260a0 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a   UNIXFILE_PSOW;.
260b0 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70    }.  if( memcmp
260c0 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e  (pVfs->zName,"un
260d0 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20  ix-excl",10)==0 
260e0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
260f0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
26100 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
26110 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
26120 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
26130 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
26140 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
26150 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
26160 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
26170 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
26180 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26190 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
261a0 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
261b0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
261c0 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
261d0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
261e0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
261f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
26200 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
26210 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
26220 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
26230 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
26240 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
26250 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
26260 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
26270 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
26280 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
26290 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
262a0 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
262b0 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
262c0 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
262d0 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
262e0 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
262f0 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
26300 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
26310 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
26320 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
26330 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
26340 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
26350 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
26360 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
26370 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
26380 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
26390 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
263a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
263b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
263c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
263d0 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
263e0 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
263f0 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
26400 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
26410 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
26420 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
26430 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
26440 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
26450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26460 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
26470 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69  or occured in fi
26480 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
26490 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
264a0 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
264b0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
264c0 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
264d0 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
264e0 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
264f0 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
26500 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
26510 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
26520 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
26530 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
26540 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
26550 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
26560 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
26570 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
26580 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
26590 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
265a0 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
265b0 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
265c0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
265d0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
265e0 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
265f0 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
26600 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
26610 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
26620 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
26630 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
26640 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
26650 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
26660 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
26670 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
26680 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
26690 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
266a0 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
266b0 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
266c0 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
266d0 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
266e0 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
266f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
26700 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
26710 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
26720 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
26730 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
26740 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
26750 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
26760 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
26770 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
26780 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
26790 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
267a0 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
267b0 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
267c0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
267d0 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
267e0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
267f0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
26800 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  E__);.      h = 
26810 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
26820 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
26830 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
26840 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
26850 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
26860 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
26870 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
26880 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
26890 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
268a0 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
268b0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
268c0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
268d0 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
268e0 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
268f0 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
26900 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
26910 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
26920 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
26930 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
26940 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
26950 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
26960 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
26970 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
26980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
26990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
269a0 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
269b0 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
269c0 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
269d0 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
269e0 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
269f0 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
26a00 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
26a10 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
26a20 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
26a30 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
26a40 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
26a50 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
26a60 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
26a70 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
26a80 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
26a90 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
26aa0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
26ab0 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
26ac0 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
26ad0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
26ae0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26b00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26b10 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
26b20 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
26b30 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
26b40 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
26b50 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
26b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
26b70 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
26b80 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
26b90 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
26ba0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
26bb0 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
26bc0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
26bd0 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
26be0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
26bf0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
26c00 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
26c10 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
26c20 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
26c30 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
26c40 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
26c50 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
26c60 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  e;.    assert( z
26c70 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20  Filename!=0 );. 
26c80 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
26c90 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
26ca0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
26cb0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
26cc0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
26cd0 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
26ce0 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
26cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
26d00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26d20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
26d30 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
26d40 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
26d50 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
26d60 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
26d70 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
26d80 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
26d90 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
26da0 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
26db0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
26dc0 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
26dd0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
26de0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
26df0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
26e00 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
26e10 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
26e20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
26e30 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
26e40 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
26e50 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
26e60 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
26e70 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
26e80 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
26e90 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
26ea0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
26eb0 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
26ec0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
26ed0 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
26ee0 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
26ef0 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
26f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
26f10 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
26f20 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
26f30 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f50 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
26f60 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
26f70 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
26f80 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
26f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
26fa0 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
26fb0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
26fc0 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
26fd0 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
26fe0 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
26ff0 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
27000 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
27010 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
27020 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
27030 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
27040 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
27050 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
27060 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
27070 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
27080 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
27090 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
270a0 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
270b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
270c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
270d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
270e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
270f0 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
27100 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
27110 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
27120 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  ;.    osUnlink(z
27130 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
27140 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d  sDelete = 0;.  }
27150 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
27160 29 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67  ) pNew->ctrlFlag
27170 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
27180 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 69  LETE;.#endif.  i
27190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
271a0 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
271b0 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
271c0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
271d0 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  _);.  }else{.   
271e0 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
271f0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
27200 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
27210 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +1);.  }.  retur
27220 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
27230 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
27240 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
27250 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
27260 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
27270 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
27280 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
27290 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
272a0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
272b0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
272c0 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
272d0 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
272e0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
272f0 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
27300 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
27310 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
27320 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
27330 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
27340 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20  ",.     0       
27350 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
27360 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e  tor */.  };.  un
27370 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
27380 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
27390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
273a0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69  Dir = 0;..  azDi
273b0 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
273c0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
273d0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
273e0 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
273f0 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
27400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
27410 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
27420 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
27430 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
27440 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
27450 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
27460 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
27470 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
27480 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
27490 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
274a0 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
274b0 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
274c0 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
274d0 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
274e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
274f0 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
27500 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
27510 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
27520 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
27530 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
27540 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
27550 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
27560 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
27570 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
27580 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27590 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
275a0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
275b0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
275c0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
275d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
275e0 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
275f0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
27600 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
27610 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
27620 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
27630 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
27640 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
27650 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
27660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
27670 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
27680 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
27690 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
276a0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
276b0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
276c0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
276d0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
276e0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
276f0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
27700 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
27710 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
27720 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
27730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
27740 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
27750 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
27760 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
27770 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
27780 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
27790 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
277a0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
277b0 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
277c0 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
277d0 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
277e0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
277f0 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
27800 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
27810 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
27820 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
27830 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69  IX) + 18) >= (si
27840 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
27850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27860 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
27870 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
27880 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
27890 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
278a0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
278b0 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
278c0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
278d0 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
278e0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
278f0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
27900 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
27910 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
27920 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
27930 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
27940 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
27950 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
27960 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
27970 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zBuf[j] = 0;.   
27980 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
27990 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
279a0 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
279b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
279c0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
279d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
279e0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
279f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
27a00 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
27a10 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
27a20 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
27a30 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
27a40 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
27a50 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
27a60 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
27a70 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
27a80 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
27a90 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
27aa0 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
27ab0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
27ac0 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
27ad0 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
27ae0 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
27af0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
27b00 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
27b10 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
27b20 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
27b30 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
27b40 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
27b50 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
27b60 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
27b70 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
27b80 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
27b90 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
27ba0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
27bb0 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
27bc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
27bd0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
27be0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
27bf0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
27c00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27c10 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
27c20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
27c30 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
27c40 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
27c50 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
27c60 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
27c70 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
27c80 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
27c90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
27ca0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
27cb0 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
27cc0 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
27cd0 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
27ce0 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
27cf0 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
27d00 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
27d10 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
27d20 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
27d30 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
27d40 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
27d50 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
27d60 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
27d70 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
27d80 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
27d90 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
27da0 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
27db0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
27dc0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
27dd0 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
27de0 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
27df0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
27e00 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
27e10 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
27e20 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
27e30 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
27e40 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
27e50 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
27e60 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
27e70 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
27e80 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
27e90 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
27ea0 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
27eb0 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
27ec0 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
27ed0 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
27ee0 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
27ef0 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
27f00 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
27f10 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
27f20 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
27f30 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
27f40 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
27f50 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
27f60 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
27f70 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
27f80 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
27f90 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
27fa0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
27fb0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
27fc0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
27fd0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
27fe0 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
27ff0 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
28000 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
28010 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
28020 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
28030 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
28040 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
28050 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
28060 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
28070 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
28080 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
28090 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
280a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
280b0 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
280c0 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
280d0 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
280e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
280f0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
28100 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
28110 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
28120 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
28130 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
28140 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
28150 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
28160 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
28170 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
28180 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
28190 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
281a0 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
281b0 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
281c0 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
281d0 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
281e0 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
281f0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
28200 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
28210 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
28220 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
28230 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
28240 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
28250 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
28260 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
28270 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
28280 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
28290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
282a0 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
282b0 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
282c0 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
282d0 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
282e0 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
282f0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
28300 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
28310 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
28320 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
28330 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
28340 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
28350 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
28360 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
28370 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
28380 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
28390 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
283a0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
283b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
283c0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
283d0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
283e0 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
283f0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
28400 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
28410 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
28420 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
28430 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
28440 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
28450 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
28460 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
28470 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
28480 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
28490 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
284a0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
284b0 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
284c0 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
284d0 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
284e0 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
284f0 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
28500 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
28510 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
28520 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
28530 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
28540 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
28550 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
28560 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
28570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
28580 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
28590 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
285a0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
285b0 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  created with.** 
285c0 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73  the octal permis
285d0 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64  sions 0600 (read
285e0 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e  /writable by own
285f0 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65  er only). If the
28600 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61   file.** is a da
28610 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72  tabase or master
28620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69   journal file, i
28630 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  t is created wit
28640 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
28650 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54  s .** mask SQLIT
28660 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
28670 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a  ERMISSIONS..**.*
28680 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  * Finally, if th
28690 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
286a0 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
286b0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
286c0 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
286d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
286e0 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
286f0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
28700 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
28710 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
28720 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
28730 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
28740 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
28750 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
28760 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
28770 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
28780 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
28790 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
287a0 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
287b0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
287c0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
287d0 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
287e0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
287f0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
28800 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
28810 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
28820 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
28830 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
28840 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
28850 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
28860 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
28870 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
28880 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
28890 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
288a0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
288b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
288c0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
288d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
288e0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
288f0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
28900 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
28910 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
28920 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
28950 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
28960 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
28970 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20  mode_t *pMode,  
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28990 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
289a0 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
289b0 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74   with */.  uid_t
289c0 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20   *pUid,         
289d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
289e0 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: uid to set on
289f0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67   the file */.  g
28a00 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20  id_t *pGid      
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a20 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65  * OUT: gid to se
28a30 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
28a40 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
28a50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
28a60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28a70 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65  Code */.  *pMode
28a80 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
28a90 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
28aa0 4e 53 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b  NS;.  *pUid = 0;
28ab0 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20  .  *pGid = 0;.  
28ac0 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
28ad0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
28ae0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
28af0 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68  URNAL) ){.    ch
28b00 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e  ar zDb[MAX_PATHN
28b10 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44  AME+1];     /* D
28b20 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
28b30 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62  h */.    int nDb
28b40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28b50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28b60 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
28b70 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74  in zDb */.    st
28b80 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
28b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28ba0 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20  utput of stat() 
28bb0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
28bc0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74   */..    /* zPat
28bd0 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61  h is a path to a
28be0 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   WAL or journal 
28bf0 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  file. The follow
28c00 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65  ing block derive
28c10 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74  s.    ** the pat
28c20 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  h to the associa
28c30 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
28c40 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68  e from zPath. Th
28c50 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
28c60 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
28c70 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e  owing naming con
28c80 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a  ventions:.    **
28c90 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
28ca0 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22   to db>-journal"
28cb0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
28cc0 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20   to db>-wal".   
28cd0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
28ce0 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20  db>-journalNN". 
28cf0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
28d00 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20  o db>-walNN".   
28d10 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
28d20 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c   NN is a decimal
28d30 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20   number. The NN 
28d40 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61  naming schemes a
28d50 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  re .    ** used 
28d60 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74  by the test_mult
28d70 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a  iplex.c module..
28d80 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d      */.    nDb =
28d90 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
28da0 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69  (zPath) - 1; .#i
28db0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28dc0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20  LE_8_3_NAMES.   
28dd0 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26   while( nDb>0 &&
28de0 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28   sqlite3Isalnum(
28df0 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44  zPath[nDb]) ) nD
28e00 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62  b--;.    if( nDb
28e10 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62  ==0 || zPath[nDb
28e20 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20  ]!='-' ) return 
28e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
28e40 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74  .    while( zPat
28e50 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20  h[nDb]!='-' ){. 
28e60 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62       assert( nDb
28e70 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
28e80 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d  rt( zPath[nDb]!=
28e90 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44  '\n' );.      nD
28ea0 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  b--;.    }.#endi
28eb0 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  f.    memcpy(zDb
28ec0 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20  , zPath, nDb);. 
28ed0 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c     zDb[nDb] = '\
28ee0 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d  0';..    if( 0==
28ef0 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74  osStat(zDb, &sSt
28f00 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d  at) ){.      *pM
28f10 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
28f20 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
28f30 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e    *pUid = sStat.
28f40 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70  st_uid;.      *p
28f50 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67  Gid = sStat.st_g
28f60 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  id;.    }else{. 
28f70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28f80 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
28f90 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
28fa0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
28fb0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
28fc0 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  E ){.    *pMode 
28fd0 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65  = 0600;.  }.  re
28fe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28ff0 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
29000 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
29010 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
29020 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
29030 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
29040 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
29050 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
29060 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
29070 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
29080 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
29090 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
290a0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
290b0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
290c0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
290d0 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
290e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
290f0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
29100 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
29110 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
29120 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
29130 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
29140 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
29150 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
29160 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
29170 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
29180 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
29190 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
291a0 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
291b0 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
291c0 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
291d0 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
291e0 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
291f0 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
29200 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
29210 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
29220 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
29230 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
29240 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
29250 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
29260 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
29270 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
29280 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
29290 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
292a0 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
292b0 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
292c0 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
292d0 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
292e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
292f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
29300 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
29310 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
29320 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
29330 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
29340 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
29350 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
29360 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
29370 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
29380 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
29390 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
293a0 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
293b0 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
293c0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
293d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
293e0 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
293f0 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
29400 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
29410 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
29420 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
29430 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
29440 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
29450 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
29460 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
29470 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
294a0 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
294b0 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
294c0 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b  t openFlags = 0;
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
294e0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
294f0 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
29500 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
29510 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
29520 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
29530 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  pen */.  int noL
29540 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
29550 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29560 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  to omit locking 
29570 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20  primitives */.  
29580 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29590 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
295a0 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
295b0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
295c0 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20  ctrlFlags = 0;  
295d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e             /* UN
295e0 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a  IXFILE_* flags *
295f0 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
29600 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
29610 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
29620 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
29630 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
29640 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
29650 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
29660 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
29670 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
29680 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
29690 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
296a0 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
296b0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
296c0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
296d0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
296e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
296f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
29700 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
29710 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29720 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f  .  int isAutoPro
29730 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  xy  = (flags & S
29740 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
29750 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ROXY);.#endif.#i
29760 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29770 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
29780 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29790 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61  YLE.  struct sta
297a0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64  tfs fsInfo;.#end
297b0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61  if..  /* If crea
297c0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72  ting a master or
297d0 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e   main-file journ
297e0 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  al, this functio
297f0 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a  n will open.  **
29800 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74   a file-descript
29810 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74  or on the direct
29820 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72  ory too. The fir
29830 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63  st time unixSync
29840 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  ().  ** is calle
29850 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  d the directory 
29860 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
29870 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65  will be fsync()e
29880 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a  d and close()d..
29890 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44    */.  int syncD
298a0 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  ir = (isCreate &
298b0 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70  & (.        eTyp
298c0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
298d0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
298e0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
298f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
29900 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
29910 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29920 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20  EN_WAL.  ));..  
29930 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
29940 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
29950 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
29960 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
29970 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
29980 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
29990 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
299a0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
299b0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
299c0 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
299d0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d  [MAX_PATHNAME+2]
299e0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
299f0 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a  zName = zPath;..
29a00 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
29a10 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
29a20 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
29a30 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
29a40 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
29a50 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
29a60 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
29a70 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
29a80 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
29a90 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
29aa0 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
29ab0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
29ac0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
29ad0 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
29ae0 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
29af0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
29b00 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
29b10 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
29b20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
29b30 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
29b40 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
29b50 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
29b60 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
29b70 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
29b80 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
29b90 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
29ba0 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
29bb0 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
29bc0 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
29bd0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
29be0 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
29bf0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
29c00 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
29c10 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
29c20 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
29c30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
29c40 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
29c50 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
29c60 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
29c70 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
29c80 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
29c90 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
29ca0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
29cb0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
29cc0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
29cd0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
29ce0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
29cf0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
29d00 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
29d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
29d20 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29d30 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29d40 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
29d50 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
29d60 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
29d70 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
29d80 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
29d90 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
29da0 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
29db0 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
29dc0 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
29dd0 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
29de0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
29df0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
29e00 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
29e10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29e20 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
29e30 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
29e40 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
29e50 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
29e60 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
29e70 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
29e80 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
29e90 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
29ea0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
29eb0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
29ec0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
29ed0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
29ee0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
29ef0 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
29f00 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
29f10 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
29f20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
29f30 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
29f40 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
29f50 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
29f60 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
29f70 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
29f80 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
29f90 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
29fa0 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
29fb0 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
29fc0 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
29fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
29fe0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
29ff0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
2a000 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
2a010 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2a020 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a030 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2a040 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2a050 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2a060 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
2a070 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
2a080 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
2a090 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
2a0a0 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
2a0b0 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
2a0c0 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
2a0d0 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
2a0e0 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
2a0f0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
2a100 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2a110 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
2a120 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2a130 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
2a140 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2a150 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
2a160 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2a170 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2a180 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2a190 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2a1a0 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2a1b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2a1c0 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
2a1d0 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
2a1e0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
2a1f0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a  AX_PATHNAME+2, z
2a200 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
2a210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a220 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2a230 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
2a240 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
2a250 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2a260 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2a270 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73  names are always
2a280 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2a290 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66  minated.    ** f
2a2a0 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65  or use by sqlite
2a2b0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
2a2c0 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
2a2d0 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  ( zName[strlen(z
2a2e0 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20  Name)+1]==0 );. 
2a2f0 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69   }..  /* Determi
2a300 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ne the value of 
2a310 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2a320 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f  ter passed to PO
2a330 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  SIX function.  *
2a340 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20  * open(). These 
2a350 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74  must be calculat
2a360 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28  ed even if open(
2a370 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c  ) is not called,
2a380 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61   as.  ** they ma
2a390 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70  y be stored as p
2a3a0 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
2a3b0 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20  handle and used 
2a3c0 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f  by the .  ** 'co
2a3d0 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e  nch file' lockin
2a3e0 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65  g functions late
2a3f0 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  r on.  */.  if( 
2a400 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70  isReadonly )  op
2a410 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
2a420 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61  NLY;.  if( isRea
2a430 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61  dWrite ) openFla
2a440 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
2a450 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
2a460 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2a470 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73  _CREAT;.  if( is
2a480 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e  Exclusive ) open
2a490 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  Flags |= (O_EXCL
2a4a0 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
2a4b0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2a4c0 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
2a4d0 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30  RY);..  if( fd<0
2a4e0 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f   ){.    mode_t o
2a4f0 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  penMode;        
2a500 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73        /* Permiss
2a510 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66  ions to create f
2a520 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20  ile with */.    
2a530 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20  uid_t uid;      
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a550 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20   Userid for the 
2a560 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f  file */.    gid_
2a570 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  t gid;          
2a580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
2a590 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  upid for the fil
2a5a0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69  e */.    rc = fi
2a5b0 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2a5c0 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26  (zName, flags, &
2a5d0 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20  openMode, &uid, 
2a5e0 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  &gid);.    if( r
2a5f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
2a610 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20  ->pUnused );.   
2a620 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2a630 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2a640 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2a650 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2a660 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65  RNAL );.      re
2a670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2a680 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2a690 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
2a6a0 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
2a6b0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
2a6c0 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30  PENX   %-3d %s 0
2a6d0 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65  %o\n", fd, zName
2a6e0 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20  , openFlags));. 
2a6f0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2a700 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
2a710 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
2a720 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
2a730 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74       /* Failed t
2a740 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2a750 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2a760 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d  ccess. Try read-
2a770 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66  only. */.      f
2a780 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
2a790 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2a7a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2a7b0 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  TE);.      openF
2a7c0 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52  lags &= ~(O_RDWR
2a7d0 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20  |O_CREAT);.     
2a7e0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
2a7f0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2a800 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
2a810 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
2a820 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
2a830 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f  1;.      fd = ro
2a840 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
2a850 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
2a860 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
2a870 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2a880 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2a890 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2a8a0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
2a8b0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
2a8c0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
2a8d0 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
2a8e0 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
2a8f0 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
2a900 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65   root and if cre
2a910 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c  ating a new roll
2a920 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
2a930 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c  nal or WAL file,
2a940 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68   set the ownersh
2a950 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ip of the journa
2a960 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20  l or WAL to be. 
2a970 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
2a980 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
2a990 61 74 61 62 61 73 65 2e 20 20 49 66 20 77 65 20  atabase.  If we 
2a9a0 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  are not running 
2a9b0 61 73 20 72 6f 6f 74 2c 0a 20 20 20 20 2a 2a 20  as root,.    ** 
2a9c0 74 68 65 6e 20 74 68 65 20 66 63 68 6f 77 6e 28  then the fchown(
2a9d0 29 20 63 61 6c 6c 20 77 69 6c 6c 20 66 61 69 6c  ) call will fail
2a9e0 2c 20 62 75 74 20 74 68 61 74 27 73 20 6f 6b 20  , but that's ok 
2a9f0 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  - there is nothi
2aa00 6e 67 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  ng.    ** we can
2aa10 20 64 6f 20 61 62 6f 75 74 20 69 74 20 73 6f 20   do about it so 
2aa20 6a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 65 20  just ignore the 
2aa30 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
2aa40 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2aa50 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2aa60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2aa70 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2aa80 20 20 66 63 68 6f 77 6e 28 66 64 2c 20 75 69 64    fchown(fd, uid
2aa90 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  , gid);.    }.  
2aaa0 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
2aab0 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
2aac0 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
2aad0 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
2aae0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55    }..  if( p->pU
2aaf0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
2ab00 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
2ab10 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  ;.    p->pUnused
2ab20 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
2ab30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65  .  }..  if( isDe
2ab40 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
2ab50 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
2ab60 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
2ab70 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61      osUnlink(zNa
2ab80 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  me);.#endif.  }.
2ab90 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2aba0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2abb0 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f    else{.    p->o
2abc0 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
2abd0 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  lags;.  }.#endif
2abe0 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45  ..#ifdef FD_CLOE
2abf0 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64  XEC.  osFcntl(fd
2ac00 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
2ac10 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
2ac20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
2ac30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f  ;.#endif..  noLo
2ac40 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49  ck = eType!=SQLI
2ac50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b  TE_OPEN_MAIN_DB;
2ac60 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  ..  .#if defined
2ac70 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
2ac80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ac90 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
2aca0 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
2acb0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2acc0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
2acd0 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  File)->lastErrno
2ace0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f   = errno;.    ro
2acf0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2ad00 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2ad10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ad20 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
2ad30 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
2ad40 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
2ad50 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2ad60 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
2ad70 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2ad80 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2ad90 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2ada0 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OS;.  }.#endif..
2adb0 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72    /* Set up appr
2adc0 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67  opriate ctrlFlag
2add0 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c  s */.  if( isDel
2ade0 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20  ete )           
2adf0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2ae00 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
2ae10 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  E;.  if( isReado
2ae20 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20  nly )           
2ae30 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2ae40 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b  UNIXFILE_RDONLY;
2ae50 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20  .  if( noLock ) 
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2ae80 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2ae90 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20   if( syncDir )  
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2aeb0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2aec0 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
2aed0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2aee0 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74  TE_OPEN_URI ) ct
2aef0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2af00 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51  ILE_URI;..#if SQ
2af10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2af20 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51  ING_STYLE.#if SQ
2af30 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2af40 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75  Y_LOCKING.  isAu
2af50 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e  toProxy = 1;.#en
2af60 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f  dif.  if( isAuto
2af70 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21  Proxy && (zPath!
2af80 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f  =NULL) && (!noLo
2af90 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  ck) && pVfs->xOp
2afa0 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
2afb0 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
2afc0 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
2afd0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
2afe0 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
2aff0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
2b000 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2b010 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
2b020 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
2b030 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61  use proxy, 0 mea
2b040 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72  ns .    ** never
2b050 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
2b060 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
2b070 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
2b080 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  iles only.  */. 
2b090 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21     if( envforce!
2b0a0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75  =NULL ){.      u
2b0b0 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65  seProxy = atoi(e
2b0c0 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20  nvforce)>0;.    
2b0d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
2b0e0 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
2b0f0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
2b100 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
2b110 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65  heory, the close
2b120 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62  (fd) call is sub
2b130 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65  -optimal. If the
2b140 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
2b150 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20       ** with fd 
2b160 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
2b170 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
2b180 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
2b190 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  ons open.       
2b1a0 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65   ** on that file
2b1b0 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
2b1c0 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69  tly holding advi
2b1d0 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74  sory locks on it
2b1e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2b1f0 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c  n the call to cl
2b200 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65  ose() will cance
2b210 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49  l those locks. I
2b220 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20  n practice,.    
2b230 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73      ** we're ass
2b240 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66  uming that statf
2b250 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c  s() doesn't fail
2b260 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20   very often. At 
2b270 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  least.        **
2b280 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72   not while other
2b290 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2b2a0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
2b2b0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a  same process on.
2b2c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
2b2d0 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72  ame file are wor
2b2e0 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20  king.  */.      
2b2f0 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d    p->lastErrno =
2b300 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2b310 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2b320 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2b330 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b340 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2b350 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
2b360 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2b370 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72     }.      usePr
2b380 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
2b390 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
2b3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b3b0 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
2b3c0 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
2b3d0 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
2b3e0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
2b3f0 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
2b400 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2b420 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2b430 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2b440 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2b450 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2b460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2b480 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2b490 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2b4a0 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2b4b0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2b4c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2b4d0 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2b4e0 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2b4f0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2b500 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2b510 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2b520 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2b530 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2b540 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2b550 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2b560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
2b570 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
2b580 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2b590 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2b5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
2b5b0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2b5c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2b5d0 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2b5e0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
2b5f0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2b600 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f  , ctrlFlags);..o
2b610 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
2b620 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b630 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2b640 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
2b650 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b660 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
2b670 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
2b680 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
2b690 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
2b6a0 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
2b6b0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
2b6c0 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
2b6d0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
2b6e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
2b6f0 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
2b700 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
2b710 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
2b720 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
2b730 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
2b740 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b750 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
2b760 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
2b770 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
2b780 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
2b790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2b7a0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
2b7b0 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
2b7c0 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
2b7d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b7e0 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
2b7f0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2b800 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
2b810 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
2b820 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2b830 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69  E);.  if( osUnli
2b840 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20  nk(zPath)==(-1) 
2b850 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54  && errno!=ENOENT
2b860 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 75   ){.    return u
2b870 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2b880 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
2b890 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68   "unlink", zPath
2b8a0 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
2b8b0 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
2b8c0 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
2b8d0 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
2b8e0 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
2b8f0 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
2b900 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
2b910 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2b920 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
2b930 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
2b940 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
2b950 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
2b960 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
2b970 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
2b980 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2b990 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2b9a0 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
2b9b0 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
2b9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b9d0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2b9e0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2b9f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2ba00 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2ba10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2ba20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2ba30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2ba40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ba50 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61   Test the exista
2ba60 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
2ba70 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
2ba80 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
2ba90 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
2baa0 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
2bab0 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
2bac0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
2bad0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
2bae0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2baf0 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
2bb00 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2bb10 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
2bb20 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2bb30 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
2bb40 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
2bb50 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2bb60 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
2bb70 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
2bb80 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
2bb90 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2bba0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
2bbb0 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
2bbc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2bbd0 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
2bbe0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
2bbf0 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
2bc00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2bc10 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
2bc20 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
2bc30 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
2bc40 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2bc50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
2bc60 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
2bc70 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
2bc80 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
2bc90 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
2bca0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2bcb0 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
2bcc0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2bcd0 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
2bce0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2bcf0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2bd00 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2bd10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2bd20 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
2bd30 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2bd40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2bd50 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
2bd60 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
2bd70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2bd80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2bd90 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
2bda0 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
2bdb0 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
2bdc0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2bdd0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2bde0 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
2bdf0 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
2be00 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
2be10 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
2be20 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
2be30 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
2be40 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
2be50 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
2be60 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
2be70 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
2be80 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
2be90 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
2bea0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2beb0 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
2bec0 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26  t(zPath, &buf) &
2bed0 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  & buf.st_size==0
2bee0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f   ){.      *pResO
2bef0 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
2bf00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2bf10 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
2bf20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
2bf30 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
2bf40 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
2bf50 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
2bf60 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
2bf70 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
2bf80 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
2bf90 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
2bfa0 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
2bfb0 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
2bfc0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
2bfd0 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
2bfe0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
2bff0 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
2c000 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
2c010 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
2c020 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
2c030 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
2c040 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
2c050 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
2c060 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
2c070 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
2c080 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2c0a0 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2c0b0 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
2c0c0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2c0d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2c0e0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
2c0f0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
2c100 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
2c110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2c120 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
2c130 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
2c140 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c160 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
2c170 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27   */.){..  /* It'
2c180 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2c190 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2c1a0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2c1b0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2c1c0 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2c1d0 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2c1e0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2c1f0 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2c200 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2c210 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
2c220 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
2c230 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
2c240 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
2c250 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
2c260 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2c270 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
2c280 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2c290 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2c2a0 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73  _ERROR );..  ass
2c2b0 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
2c2c0 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
2c2d0 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
2c2e0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2c2f0 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d  ..  zOut[nOut-1]
2c300 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
2c310 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
2c320 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2c330 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c  intf(nOut, zOut,
2c340 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
2c350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2c360 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73  nCwd;.    if( os
2c370 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  Getcwd(zOut, nOu
2c380 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
2c390 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
2c3a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2c3b0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63  OPEN_BKPT, "getc
2c3c0 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  wd", zPath);.   
2c3d0 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
2c3e0 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
2c3f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2c400 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
2c410 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
2c420 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
2c430 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c440 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
2c450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2c460 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
2c470 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
2c480 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
2c490 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
2c4a0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
2c4b0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
2c4c0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
2c4d0 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
2c4e0 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
2c4f0 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
2c500 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
2c510 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
2c520 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2c530 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2c540 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
2c550 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2c560 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2c570 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
2c580 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
2c590 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
2c5a0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
2c5b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c5c0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
2c5d0 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
2c5e0 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
2c5f0 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
2c600 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
2c610 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
2c620 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
2c630 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
2c640 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
2c650 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
2c660 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
2c670 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
2c680 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
2c690 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
2c6a0 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
2c6b0 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
2c6c0 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
2c6d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2c6e0 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
2c6f0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2c700 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
2c710 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
2c720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
2c730 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2c740 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2c750 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c760 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
2c770 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
2c780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2c790 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
2c7a0 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
2c7b0 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
2c7c0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
2c7d0 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
2c7e0 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
2c7f0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
2c800 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
2c810 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2c820 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
2c830 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
2c840 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
2c850 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
2c860 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
2c870 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
2c880 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
2c890 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
2c8a0 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
2c8b0 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
2c8c0 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
2c8d0 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
2c8e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2c8f0 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
2c900 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
2c910 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
2c920 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
2c930 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
2c940 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
2c950 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
2c960 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2c970 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
2c980 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
2c990 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
2c9a0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
2c9b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
2c9c0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
2c9d0 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
2c9e0 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
2c9f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
2ca00 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
2ca10 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
2ca20 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
2ca30 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
2ca40 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
2ca50 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
2ca60 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
2ca70 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
2ca80 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
2ca90 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
2caa0 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
2cab0 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
2cac0 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
2cad0 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
2cae0 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
2caf0 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
2cb00 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
2cb10 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
2cb20 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
2cb30 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
2cb40 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
2cb50 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
2cb60 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
2cb70 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
2cb80 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
2cb90 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
2cba0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2cbb0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
2cbc0 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
2cbd0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
2cbe0 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
2cbf0 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
2cc00 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
2cc10 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
2cc20 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2cc30 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
2cc40 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
2cc50 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2cc60 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
2cc70 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
2cc80 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
2cc90 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
2cca0 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
2ccb0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
2ccc0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
2ccd0 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
2cce0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
2ccf0 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
2cd00 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
2cd10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
2cd20 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
2cd30 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
2cd40 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
2cd50 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
2cd60 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
2cd70 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
2cd80 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2cd90 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2cda0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2cdb0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2cdc0 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
2cdd0 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
2cde0 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
2cdf0 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
2ce00 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
2ce10 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
2ce20 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
2ce30 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
2ce40 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
2ce50 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
2ce60 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
2ce70 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
2ce80 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
2ce90 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
2cea0 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
2ceb0 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
2cec0 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
2ced0 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
2cee0 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
2cef0 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
2cf00 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
2cf10 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
2cf20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
2cf30 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
2cf40 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
2cf50 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
2cf60 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
2cf70 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
2cf80 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
2cf90 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
2cfa0 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
2cfb0 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
2cfc0 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
2cfd0 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
2cfe0 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
2cff0 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
2d000 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
2d010 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
2d020 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
2d030 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
2d040 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
2d050 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
2d060 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
2d070 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
2d080 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
2d090 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
2d0a0 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 2c      int pid, fd,
2d0b0 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72   got;.    fd = r
2d0c0 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
2d0d0 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
2d0e0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
2d0f0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
2d100 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
2d110 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
2d120 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
2d130 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
2d140 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
2d150 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
2d160 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
2d170 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
2d180 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
2d190 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
2d1a0 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
2d1b0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
2d1c0 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
2d1d0 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
2d1e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d1f0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61   do{ got = osRea
2d200 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66  d(fd, zBuf, nBuf
2d210 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
2d220 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
2d230 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   );.      robust
2d240 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
2d250 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
2d260 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2d270 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nBuf;.}.../*.
2d280 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
2d290 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
2d2a0 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
2d2b0 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
2d2c0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
2d2d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2d2e0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20  microseconds we 
2d2f0 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a  want to sleep..*
2d300 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2d310 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2d320 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
2d330 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c   of sleep actual
2d340 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  ly.** requested 
2d350 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
2d360 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
2d370 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77  stem, a number w
2d380 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
2d390 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
2d3a0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72   equal to the ar
2d3b0 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  gument, but not 
2d3c0 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65  less.** than the
2d3d0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
2d3e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65  atic int unixSle
2d3f0 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
2d400 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63  NotUsed, int mic
2d410 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
2d420 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2d430 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b  uct timespec sp;
2d440 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20  ..  sp.tv_sec = 
2d450 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31  microseconds / 1
2d460 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f  000000;.  sp.tv_
2d470 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63  nsec = (microsec
2d480 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20  onds % 1000000) 
2d490 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c  * 1000;.  nanosl
2d4a0 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a  eep(&sp, NULL);.
2d4b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d4c0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2d4d0 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
2d4e0 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  ds;.#elif define
2d4f0 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
2d500 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  & HAVE_USLEEP.  
2d510 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f  usleep(microseco
2d520 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
2d530 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2d540 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
2d550 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a  oseconds;.#else.
2d560 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20    int seconds = 
2d570 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39  (microseconds+99
2d580 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20  9999)/1000000;. 
2d590 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b   sleep(seconds);
2d5a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d5b0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2d5c0 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31  return seconds*1
2d5d0 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d  000000;.#endif.}
2d5e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2d5f0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
2d600 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
2d610 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
2d620 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
2d630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2d640 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2d650 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
2d660 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
2d670 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
2d680 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
2d690 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
2d6a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2d6b0 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
2d6c0 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
2d6d0 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
2d6e0 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
2d6f0 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
2d700 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
2d710 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2d720 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2d730 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2d740 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
2d750 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
2d760 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2d770 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2d780 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
2d790 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
2d7a0 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
2d7b0 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
2d7c0 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
2d7d0 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
2d7e0 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
2d7f0 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
2d800 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
2d810 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
2d820 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
2d830 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
2d840 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
2d850 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
2d860 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
2d870 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
2d880 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2d890 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
2d8a0 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
2d8b0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
2d8c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
2d8d0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
2d8e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2d8f0 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
2d900 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
2d910 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2d920 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
2d930 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
2d940 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2d950 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d  0000;.  int rc =
2d960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20   SQLITE_OK;.#if 
2d970 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
2d980 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
2d990 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69   time(&t);.  *pi
2d9a0 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f  Now = ((sqlite3_
2d9b0 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20  int64)t)*1000 + 
2d9c0 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66  unixEpoch;.#elif
2d9d0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
2d9e0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
2d9f0 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
2da00 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
2da10 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
2da20 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
2da30 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
2da40 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
2da50 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  ec + sNow.tv_nse
2da60 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65  c/1000000;.#else
2da70 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
2da80 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65  l sNow;.  if( ge
2da90 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
2daa0 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  , 0)==0 ){.    *
2dab0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
2dac0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
2dad0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
2dae0 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
2daf0 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65  ec/1000;.  }else
2db00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2db10 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e  E_ERROR;.  }.#en
2db20 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2db30 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
2db40 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2db50 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
2db60 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
2db70 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
2db80 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
2db90 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
2dba0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
2dbb0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2dbc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dbd0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2dbe0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2dbf0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2dc00 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2dc10 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
2dc20 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2dc30 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2dc40 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
2dc50 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
2dc60 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
2dc70 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2dc80 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
2dc90 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2dca0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
2dcb0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2dcc0 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
2dcd0 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
2dce0 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
2dcf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55  .  int rc;.  UNU
2dd00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2dd10 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75  tUsed);.  rc = u
2dd20 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
2dd30 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
2dd40 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
2dd50 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0.0;.  return rc
2dd60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64  ;.}../*.** We ad
2dd70 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74  ded the xGetLast
2dd80 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77  Error() method w
2dd90 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f  ith the intentio
2dda0 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a  n of providing.*
2ddb0 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76  * better low-lev
2ddc0 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  el error message
2ddd0 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  s when operating
2dde0 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73  -system problems
2ddf0 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69   come up.** duri
2de00 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74  ng SQLite operat
2de10 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72  ion.  But so far
2de20 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68  , none of that h
2de30 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
2de40 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ted.** in the co
2de50 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75  re.  So this rou
2de60 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
2de70 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  lled.  For now, 
2de80 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20  it is merely.** 
2de90 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a  a place-holder..
2dea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2deb0 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  ixGetLastError(s
2dec0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2ded0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
2dee0 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64  2, char *NotUsed
2def0 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  3){.  UNUSED_PAR
2df00 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2df10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2df20 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20  TER(NotUsed2);. 
2df30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2df40 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72  R(NotUsed3);.  r
2df50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
2df60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df70 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
2df80 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2df90 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2dfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2dfb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dfc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dfd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dfe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2e000 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2e010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e050 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2e060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
2e070 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20  n Proxy Locking 
2e080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e0a0 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  .**.** Proxy loc
2e0b0 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d  king is a "uber-
2e0c0 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20  locking-method" 
2e0d0 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20  in this sense:  
2e0e0 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f  It uses the.** o
2e0f0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ther locking met
2e100 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72  hods on secondar
2e110 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50  y lock files.  P
2e120 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2e130 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20  a.** meta-layer 
2e140 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20  over top of the 
2e150 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
2e160 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62  g implemented ab
2e170 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69  ove.  For.** thi
2e180 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
2e190 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
2e1a0 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20  ements of proxy 
2e1b0 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  locking is defer
2e1c0 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74  red.** until lat
2e1d0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68  e in the file (h
2e1e0 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f  ere) after all o
2e1f0 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20  f the other I/O 
2e200 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20  methods have.** 
2e210 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73  been defined - s
2e220 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69  o that the primi
2e230 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  tive locking met
2e240 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62  hods are availab
2e250 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65  le.** as service
2e260 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74  s to help with t
2e270 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2e280 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  n of proxy locki
2e290 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ng..**.****.**.*
2e2a0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  * The default lo
2e2b0 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e  cking schemes in
2e2c0 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65   SQLite use byte
2e2d0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20  -range locks on 
2e2e0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2e2f0 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61  file to coordina
2e300 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72  te safe, concurr
2e310 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75  ent access by mu
2e320 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a  ltiple readers.*
2e330 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68  * and writers [h
2e340 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
2e350 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d  /lockingv3.html]
2e360 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65  .  The five file
2e370 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74   locking.** stat
2e380 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45  es (UNLOCKED, PE
2e390 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52  NDING, SHARED, R
2e3a0 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49  ESERVED, EXCLUSI
2e3b0 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  VE) are implemen
2e3c0 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20  ted.** as POSIX 
2e3d0 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63  read & write loc
2e3e0 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65  ks over fixed se
2e3f0 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28  t of locations (
2e400 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f  via fsctl),.** o
2e410 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e  n AFP and SMB on
2e420 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  ly exclusive byt
2e430 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
2e440 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20  e available via 
2e450 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49  fsctl.** with _I
2e460 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
2e470 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
2e480 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74  kPB2) to track t
2e490 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73  he same 5 states
2e4a0 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65  ..** To simulate
2e4b0 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68   a F_RDLCK on th
2e4c0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20  e shared range, 
2e4d0 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c  on AFP a randoml
2e4e0 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64  y selected.** ad
2e4f0 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61  dress in the sha
2e500 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
2e510 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20  en for a SHARED 
2e520 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65  lock, the entire
2e530 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65  .** shared range
2e540 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e   is taken for an
2e550 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29   EXCLUSIVE lock)
2e560 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e  :.**.**      PEN
2e570 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20  DING_BYTE       
2e580 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20 20   0x40000000..   
2e590 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56  ..**      RESERV
2e5a0 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78  ED_BYTE       0x
2e5b0 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20  40000001.**     
2e5c0 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20   SHARED_RANGE   
2e5d0 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20       0x40000002 
2e5e0 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a  -> 0x40000200.**
2e5f0 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77  .** This works w
2e600 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ell on the local
2e610 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75   file system, bu
2e620 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79  t shows a nearly
2e630 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77   100x.** slowdow
2e640 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72  n in read perfor
2e650 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63  mance on AFP bec
2e660 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69  ause the AFP cli
2e670 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20  ent disables.** 
2e680 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77  the read cache w
2e690 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  hen byte-range l
2e6a0 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
2e6b0 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20  .  Enabling the 
2e6c0 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78  read.** cache ex
2e6d0 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f  poses a cache co
2e6e0 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20  herency problem 
2e6f0 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
2e700 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73  on all OS X.** s
2e710 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b  upported network
2e720 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20   file systems.  
2e730 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68  NFS and AFP both
2e740 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20   observe the.** 
2e750 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65  close-to-open se
2e760 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75  mantics for ensu
2e770 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72  ring cache coher
2e780 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ency.** [http://
2e790 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e  nfs.sourceforge.
2e7a0 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68  net/#faq_a8], wh
2e7b0 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66  ich does not eff
2e7c0 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72  ectively.** addr
2e7d0 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d  ess the requirem
2e7e0 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72  ents for concurr
2e7f0 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63  ent database acc
2e800 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ess by multiple.
2e810 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  ** readers and w
2e820 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a  riters.** [http:
2e830 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d  //www.nabble.com
2e840 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63  /SQLite-on-NFS-c
2e850 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74  ache-coherency-t
2e860 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e  d15655701.html].
2e870 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73  .**.** To addres
2e880 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  s the performanc
2e890 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65  e and cache cohe
2e8a0 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72  rency issues, pr
2e8b0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
2e8c0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20  .** changes the 
2e8d0 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63  way database acc
2e8e0 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65  ess is controlle
2e8f0 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63  d by limiting ac
2e900 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e  cess to a.** sin
2e910 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69  gle host at a ti
2e920 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69  me and moving fi
2e930 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20  le locks off of 
2e940 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e950 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20  e.** and onto a 
2e960 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68  proxy file on th
2e970 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
2e980 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tem.  .**.**.** 
2e990 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b  Using proxy lock
2e9a0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2e9b0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41  ------.**.** C A
2e9c0 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  PIs.**.**  sqlit
2e9d0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2e9e0 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
2e9f0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
2ea00 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
2ea20 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a  proxy_path> | ":
2ea30 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c  auto:");.**  sql
2ea40 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2ea50 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
2ea60 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
2ea70 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f  XYFILE, &<proxy_
2ea80 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
2ea90 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
2eaa0 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
2eab0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
2eac0 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
2ead0 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
2eae0 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
2eaf0 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
2eb00 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
2eb10 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
2eb20 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
2eb30 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
2eb40 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
2eb50 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
2eb60 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
2eb70 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
2eb80 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
2eb90 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
2eba0 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
2ebb0 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
2ebc0 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
2ebd0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
2ebe0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2ebf0 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
2ec00 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
2ec10 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
2ec20 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
2ec30 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
2ec40 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
2ec50 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
2ec60 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
2ec70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
2ec80 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
2ec90 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
2eca0 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
2ecb0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
2ecc0 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
2ecd0 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
2ece0 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
2ecf0 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
2ed00 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
2ed10 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
2ed20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2ed30 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
2ed40 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
2ed50 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
2ed60 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
2ed70 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
2ed80 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
2ed90 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
2eda0 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
2edb0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
2edc0 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
2edd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
2ede0 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
2edf0 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
2ee00 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
2ee10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee20 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
2ee30 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
2ee40 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
2ee50 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
2ee60 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
2ee70 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
2ee80 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
2ee90 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
2eea0 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
2eeb0 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
2eec0 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
2eed0 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
2eee0 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
2eef0 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
2ef00 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
2ef10 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
2ef20 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
2ef30 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
2ef40 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
2ef50 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
2ef60 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
2ef70 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
2ef80 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
2ef90 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
2efa0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
2efb0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
2efc0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
2efd0 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
2efe0 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
2eff0 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
2f000 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
2f010 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
2f020 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
2f030 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
2f040 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
2f050 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
2f060 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
2f070 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
2f080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f090 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
2f0a0 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
2f0b0 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
2f0c0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2f0d0 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
2f0e0 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
2f0f0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2f100 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2f110 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73  or it's contents
2f120 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68   do not match th
2f130 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64  e.** host ID and
2f140 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20  /or proxy path, 
2f150 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73  then the lock is
2f160 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e   escalated to an
2f170 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f   exclusive.** lo
2f180 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68  ck and the conch
2f190 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69   file contents i
2f1a0 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  s updated with t
2f1b0 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70  he host ID and p
2f1c0 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64  roxy.** path and
2f1d0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77   the lock is dow
2f1e0 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61  ngraded to a sha
2f1f0 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20  red lock again. 
2f200 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a   If the conch.**
2f210 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74   is held by anot
2f220 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74  her process (wit
2f230 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29  h a shared lock)
2f240 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  , the exclusive 
2f250 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69  lock.** will fai
2f260 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53  l and SQLITE_BUS
2f270 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
2f280 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
2f290 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62  ile - a single-b
2f2a0 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  yte file used fo
2f2b0 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66  r all advisory f
2f2c0 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72  ile locks.** nor
2f2d0 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74  mally taken on t
2f2e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f2f0 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .   This allows 
2f300 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67  for safe sharing
2f310 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
2f320 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c  ase file for mul
2f330 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e  tiple readers an
2f340 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65  d writers on the
2f350 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74   same.** host (t
2f360 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73  he conch ensures
2f370 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75   that they all u
2f380 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61  se the same loca
2f390 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a  l lock file)..**
2f3a0 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74  .** Requesting t
2f3b0 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f  he lock proxy do
2f3c0 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65  es not immediate
2f3d0 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63  ly take the conc
2f3e0 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79  h, it is.** only
2f3f0 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2f400 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f  first request to
2f410 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66   lock database f
2f420 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a  ile is made.  .*
2f430 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  * This matches t
2f440 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20  he semantics of 
2f450 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20  the traditional 
2f460 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  locking behavior
2f470 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69  , where.** openi
2f480 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ng a connection 
2f490 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
2f4a0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65  le does not take
2f4b0 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a   a lock on it..*
2f4c0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63  * The shared loc
2f4d0 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69  k and an open fi
2f4e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
2f4f0 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74  e maintained unt
2f500 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65  il .** the conne
2f510 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
2f520 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e  abase is closed.
2f530 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78   .**.** The prox
2f540 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c  y file and the l
2f550 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76  ock file are nev
2f560 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68  er deleted so th
2f570 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20  ey only need.** 
2f580 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68  to be created th
2f590 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
2f5a0 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  y are used..**.*
2f5b0 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
2f5c0 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d  options.** -----
2f5d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f5e0 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50  .**.**  SQLITE_P
2f5f0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2f600 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ING.**.**       
2f610 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  Database files a
2f620 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c  ccessed on non-l
2f630 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
2f640 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  s are.**       a
2f650 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
2f660 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78  figured for prox
2f670 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20  y locking, lock 
2f680 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20  files are.**    
2f690 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74     named automat
2f6a0 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65  ically using the
2f6b0 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a   same logic as.*
2f6c0 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  *       PRAGMA l
2f6d0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22  ock_proxy_file="
2f6e0 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a  :auto:".**    .*
2f6f0 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  *  SQLITE_PROXY_
2f700 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  DEBUG.**.**     
2f710 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f    Enables the lo
2f720 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d  gging of error m
2f730 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68  essages during h
2f740 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20  ost id file.**  
2f750 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61       retrieval a
2f760 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a  nd creation.**.*
2f770 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  *  LOCKPROXYDIR.
2f780 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72  **.**       Over
2f790 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c  rides the defaul
2f7a0 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64  t directory used
2f7b0 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20   for lock proxy 
2f7c0 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  files that.**   
2f7d0 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75      are named au
2f7e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20  tomatically via 
2f7f0 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74  the ":auto:" set
2f800 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ting.**.**  SQLI
2f810 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
2f820 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
2f830 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d  **.**       Perm
2f840 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77  issions to use w
2f850 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64  hen creating a d
2f860 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f  irectory for sto
2f870 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ring the.**     
2f880 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c    lock proxy fil
2f890 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68  es, only used wh
2f8a0 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20  en LOCKPROXYDIR 
2f8b0 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20  is not set..**  
2f8c0 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20    .**    .** As 
2f8d0 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c  mentioned above,
2f8e0 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77   when compiled w
2f8f0 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45  ith SQLITE_PREFE
2f900 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c  R_PROXY_LOCKING,
2f910 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20  .** setting the 
2f920 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
2f930 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43  able SQLITE_FORC
2f940 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  E_PROXY_LOCKING 
2f950 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72  to 1 will.** for
2f960 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ce proxy locking
2f970 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
2f980 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66  every database f
2f990 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20  ile opened, and 
2f9a0 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20  0.** will force 
2f9b0 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20  automatic proxy 
2f9c0 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69  locking to be di
2f9d0 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64  sabled for all d
2f9e0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
2f9f0 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c   (explicity call
2fa00 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53  ing the SQLITE_S
2fa10 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2fa20 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
2fa30 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
2fa40 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
2fa50 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
2fa60 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2fa70 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
2fa80 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2fa90 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
2faa0 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
2fab0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2fac0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2fad0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2fae0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
2faf0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2fb00 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
2fb10 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
2fb20 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
2fb30 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
2fb40 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
2fb50 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
2fb60 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
2fb70 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
2fb80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
2fb90 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
2fba0 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
2fbb0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
2fbc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
2fbd0 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
2fbe0 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
2fbf0 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
2fc00 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2fc10 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
2fc20 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
2fc30 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
2fc40 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
2fc50 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
2fc60 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
2fc70 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2fc80 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
2fc90 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
2fca0 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
2fcb0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2fcc0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
2fcd0 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
2fce0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2fcf0 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
2fd00 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
2fd10 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
2fd20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
2fd30 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
2fd40 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
2fd50 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
2fd60 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
2fd70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2fd80 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
2fd90 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
2fda0 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
2fdb0 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
2fdc0 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
2fdd0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
2fde0 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
2fdf0 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
2fe00 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
2fe10 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
2fe20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
2fe30 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
2fe40 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
2fe50 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
2fe60 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
2fe70 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
2fe80 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
2fe90 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
2fea0 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
2feb0 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
2fec0 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
2fed0 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
2fee0 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
2fef0 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
2ff00 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
2ff10 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
2ff20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
2ff30 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
2ff40 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
2ff50 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
2ff60 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
2ff70 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
2ff80 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
2ff90 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
2ffa0 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
2ffb0 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
2ffc0 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
2ffd0 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
2ffe0 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28  , errno, getpid(
2fff0 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
30000 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
30010 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  OCK;.    }.    l
30020 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
30030 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b  th, "sqliteplock
30040 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20  s", maxLen);    
30050 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
30060 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
30070 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
30080 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
30090 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
300a0 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
300b0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
300c0 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
300d0 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
300e0 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
300f0 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
30100 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
30110 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
30120 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
30130 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
30140 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
30150 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20  7)<(int)maxLen; 
30160 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
30170 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
30180 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
30190 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
301a0 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
301b0 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
301c0 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
301d0 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
301e0 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
301f0 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
30200 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
30210 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70  \n", lPath, getp
30220 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
30230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
30240 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74  * . ** Creates t
30250 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64  he lock file and
30260 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72   any missing dir
30270 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b  ectories in lock
30280 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20  Path. */.static 
30290 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c  int proxyCreateL
302a0 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
302b0 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20  ar *lockPath){. 
302c0 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63   int i, len;.  c
302d0 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c  har buf[MAXPATHL
302e0 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  EN];.  int start
302f0 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
30300 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c  t(lockPath!=NULL
30310 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63  );.  /* try to c
30320 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e  reate all the in
30330 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63  termediate direc
30340 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20  tories */.  len 
30350 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f  = (int)strlen(lo
30360 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30  ckPath);.  buf[0
30370 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b  ] = lockPath[0];
30380 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c  .  for( i=1; i<l
30390 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69  en; i++ ){.    i
303a0 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d  f( lockPath[i] =
303b0 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74  = '/' && (i - st
303c0 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20  art > 0) ){.    
303d0 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20    /* only mkdir 
303e0 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22  if leaf dir != "
303f0 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e  ." or "/" or "..
30400 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  " */.      if( i
30410 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73  -start>2 || (i-s
30420 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73  tart==1 && buf[s
30430 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
30440 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f  buf[start] != '/
30450 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ') .         || 
30460 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62  (i-start==2 && b
30470 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
30480 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d   && buf[start+1]
30490 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20   != '.') ){.    
304a0 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b      buf[i]='\0';
304b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d  .        if( osM
304c0 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45  kdir(buf, SQLITE
304d0 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
304e0 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29  R_PERMISSIONS) )
304f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
30500 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
30510 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45       if( err!=EE
30520 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20  XIST ) {.       
30530 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43       OSTRACE(("C
30540 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46  REATELOCKPATH  F
30550 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25  AILED creating %
30560 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s, ".           
30570 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20            "'%s' 
30580 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
30590 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %s pid=%d\n",.  
305a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305b0 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72     buf, strerror
305c0 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c  (err), lockPath,
305d0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
305e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
305f0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
30600 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30610 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
30620 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
30630 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
30640 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
30650 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
30660 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
30670 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
30680 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
30690 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
306a0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
306b0 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69  ate a new VFS fi
306c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73  le descriptor (s
306d0 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
306e0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
306f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
30700 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69   and open the fi
30710 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20  le named "path" 
30720 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
30730 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  riptor..**.** Th
30740 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
30750 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79  onsible not only
30760 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65   for closing the
30770 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30780 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72  .** but also for
30790 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d   freeing the mem
307a0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
307b0 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73  ith the file des
307c0 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
307d0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
307e0 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20  teUnixFile(.    
307f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
30800 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68  ,        /* path
30810 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
30820 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69  xFile */.    uni
30830 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20  xFile **ppFile, 
30840 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c        /* unixFil
30850 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65  e created and re
30860 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f  turned by ref */
30870 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66  .    int islockf
30880 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ile           /*
30890 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73   if non zero mis
308a0 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62  sing dirs will b
308b0 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b  e created */.) {
308c0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
308d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
308e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
308f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70  ITE_OK;.  int op
30900 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
30910 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71   | O_CREAT;.  sq
30920 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56  lite3_vfs dummyV
30930 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f  fs;.  int terrno
30940 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73   = 0;.  UnixUnus
30950 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
30960 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66  NULL;..  /* 1. f
30970 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e  irst try to open
30980 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
30990 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74  .  ** 2. if that
309a0 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73   fails, and this
309b0 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   is a lock file 
309c0 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79  (not-conch), try
309d0 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
309e0 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74  he parent direct
309f0 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74  ories and then t
30a00 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33  ry again..  ** 3
30a10 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c  . if that fails,
30a20 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   try to open the
30a30 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   file read-only.
30a40 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72    ** otherwise r
30a50 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c  eturn BUSY (if l
30a60 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e  ock file) or CAN
30a70 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f  TOPEN for the co
30a80 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20  nch file.  */.  
30a90 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
30aa0 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f  usableFd(path, o
30ab0 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  penFlags);.  if(
30ac0 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
30ad0 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
30ae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
30af0 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
30b00 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
30b10 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69  pUnused));.    i
30b20 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
30b30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30b40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
30b50 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
30b60 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  {.    fd = robus
30b70 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
30b80 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44  nFlags, SQLITE_D
30b90 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
30ba0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65  ISSIONS);.    te
30bb0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
30bc0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
30bd0 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69  rno==ENOENT && i
30be0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
30bf0 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61     if( proxyCrea
30c00 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29  teLockPath(path)
30c10 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
30c20 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f  .        fd = ro
30c30 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
30c40 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
30c50 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
30c60 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
30c70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
30c80 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
30c90 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
30ca0 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
30cb0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
30cc0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
30cd0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
30ce0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
30cf0 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
30d00 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
30d10 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
30d20 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
30d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
30d40 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
30d50 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
30d60 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
30d70 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
30d80 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
30d90 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
30da0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30db0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
30dc0 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
30dd0 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
30de0 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
30df0 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
30e00 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
30e10 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
30e20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
30e30 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
30e40 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
30e50 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
30e60 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
30e70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
30e80 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
30e90 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
30ea0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
30eb0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
30ec0 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
30ed0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
30ee0 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74  nFlags;.  memset
30ef0 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73  (&dummyVfs, 0, s
30f00 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29  izeof(dummyVfs))
30f10 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
30f20 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
30f30 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
30f40 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61  ;.  dummyVfs.zNa
30f50 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20  me = "dummy";.  
30f60 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
30f70 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61  ;.  pUnused->fla
30f80 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
30f90 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20    pNew->pUnused 
30fa0 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20  = pUnused;.  .  
30fb0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
30fc0 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
30fd0 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
30fe0 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29  *)pNew, path, 0)
30ff0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
31000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
31010 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
31020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31030 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74  K;.  }.end_creat
31040 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72  e_proxy:    .  r
31050 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
31060 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
31070 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
31080 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  pNew);.  sqlite3
31090 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a  _free(pUnused);.
310a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
310b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
310c0 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  ST./* simulate m
310d0 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
310e0 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
310f0 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
31100 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  hs */.int sqlite
31110 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30  3_hostid_num = 0
31120 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
31130 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  e PROXY_HOSTIDLE
31140 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63  N    16  /* conc
31150 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c  h file host id l
31160 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74  ength */../* Not
31170 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20   always defined 
31180 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61  in the headers a
31190 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  s it ought to be
311a0 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67   */.extern int g
311b0 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f  ethostuuid(uuid_
311c0 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75  t id, const stru
311d0 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69  ct timespec *wai
311e0 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20  t);../* get the 
311f0 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68  host ID via geth
31200 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74  ostuuid(), pHost
31210 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ID must point to
31220 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
31230 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72   .** bytes of wr
31240 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a  itable memory..*
31250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31260 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69  xyGetHostID(unsi
31270 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74  gned char *pHost
31280 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29  ID, int *pError)
31290 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59  {.  assert(PROXY
312a0 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69  _HOSTIDLEN == si
312b0 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20  zeof(uuid_t));. 
312c0 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c   memset(pHostID,
312d0 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   0, PROXY_HOSTID
312e0 4c 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  LEN);.#if define
312f0 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52  d(__MAX_OS_X_VER
31300 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
31310 44 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  D)\.            
31320 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58     && __MAC_OS_X
31330 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
31340 55 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20  UIRED<1050.  {. 
31350 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
31360 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
31370 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d  timeout = {1, 0}
31380 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f  ; /* 1 sec timeo
31390 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  ut */.    if( ge
313a0 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49  thostuuid(pHostI
313b0 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a  D, &timeout) ){.
313c0 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
313d0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
313e0 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
313f0 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
31400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
31420 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
31430 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
31440 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b  RAMETER(pError);
31450 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
31460 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20  QLITE_TEST.  /* 
31470 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
31480 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
31490 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
314a0 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
314b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f    if( sqlite3_ho
314c0 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a  stid_num != 0){.
314d0 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d      pHostID[0] =
314e0 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b   (char)(pHostID[
314f0 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69  0] + (char)(sqli
31500 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26  te3_hostid_num &
31510 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e   0xFF));.  }.#en
31520 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  dif.  .  return 
31530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
31540 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
31550 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61  contains the hea
31560 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64  der, host id and
31570 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a   lock file path.
31580 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
31590 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32  Y_CONCHVERSION 2
315a0 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61     /* 1-byte hea
315b0 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73  der, 16-byte hos
315c0 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64  t id, path */.#d
315d0 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44  efine PROXY_HEAD
315e0 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20  ERLEN    1   /* 
315f0 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65  conch file heade
31600 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66  r length */.#def
31610 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  ine PROXY_PATHIN
31620 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45  DEX    (PROXY_HE
31630 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
31640 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65  STIDLEN).#define
31650 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
31660 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45  EN  (PROXY_HEADE
31670 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
31680 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29  DLEN+MAXPATHLEN)
31690 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61  ../* .** Takes a
316a0 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  n open conch fil
316b0 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f  e, copies the co
316c0 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20  ntents to a new 
316d0 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f  path and then mo
316e0 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e  ves .** it back.
316f0 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61    The newly crea
31700 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20  ted file's file 
31710 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73  descriptor is as
31720 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a  signed to the.**
31730 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75   conch file stru
31740 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c  cture and finall
31750 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  y the original c
31760 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  onch file descri
31770 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73  ptor is .** clos
31780 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72  ed.  Returns zer
31790 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  o if successful.
317a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
317b0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
317c0 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
317d0 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
317e0 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  tID){.  proxyLoc
317f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
31800 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
31810 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
31820 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
31830 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
31840 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
31850 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68  >conchFile;.  ch
31860 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48  ar tPath[MAXPATH
31870 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66  LEN];.  char buf
31880 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
31890 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61  EN];.  char *cPa
318a0 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  th = pCtx->conch
318b0 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65  FilePath;.  size
318c0 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  _t readLen = 0;.
318d0 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
318e0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72   = 0;.  char err
318f0 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20  msg[64] = "";.  
31900 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69  int fd = -1;.  i
31910 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e  nt rc = -1;.  UN
31920 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d  USED_PARAMETER(m
31930 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20  yHostID);..  /* 
31940 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74  create a new pat
31950 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65  h by replace the
31960 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63   trailing '-conc
31970 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27  h' with '-break'
31980 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20   */.  pathLen = 
31990 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63  strlcpy(tPath, c
319a0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
319b0 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e  );.  if( pathLen
319c0 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70  >MAXPATHLEN || p
319d0 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20  athLen<6 || .   
319e0 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74    (strlcpy(&tPat
319f0 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62  h[pathLen-5], "b
31a00 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20  reak", 6) != 5) 
31a10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
31a20 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
31a30 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70  rrmsg),errmsg,"p
31a40 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ath error (len %
31a50 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e  d)",(int)pathLen
31a60 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
31a70 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
31a80 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e   /* read the con
31a90 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ch content */.  
31aa0 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61  readLen = osPrea
31ab0 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
31ac0 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  buf, PROXY_MAXCO
31ad0 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66  NCHLEN, 0);.  if
31ae0 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f  ( readLen<PROXY_
31af0 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20  PATHINDEX ){.   
31b00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31b10 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
31b20 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72  ,errmsg,"read er
31b30 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
31b40 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20  nt)readLen);.   
31b50 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
31b60 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72  ock;.  }.  /* wr
31b70 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
31b80 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61  e temporary brea
31b90 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d  k file */.  fd =
31ba0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61   robust_open(tPa
31bb0 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
31bc0 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20  EAT|O_EXCL),.   
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31be0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
31bf0 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
31c00 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
31c10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31c20 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
31c30 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72  sg), errmsg, "cr
31c40 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  eate failed (%d)
31c50 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
31c60 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
31c70 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50  k;.  }.  if( osP
31c80 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72  write(fd, buf, r
31c90 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73  eadLen, 0) != (s
31ca0 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29  size_t)readLen )
31cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
31cc0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
31cd0 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
31ce0 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64  write failed (%d
31cf0 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
31d00 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
31d10 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  ck;.  }.  if( re
31d20 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74  name(tPath, cPat
31d30 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  h) ){.    sqlite
31d40 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31d50 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
31d60 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65  g, "rename faile
31d70 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
31d80 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
31d90 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72  eaklock;.  }.  r
31da0 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66  c = 0;.  fprintf
31db0 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20  (stderr, "broke 
31dc0 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
31dd0 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72  \n", cPath);.  r
31de0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
31df0 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  e, conchFile->h,
31e00 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f   __LINE__);.  co
31e10 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b  nchFile->h = fd;
31e20 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  .  conchFile->op
31e30 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
31e40 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64   | O_CREAT;..end
31e50 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66  _breaklock:.  if
31e60 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
31e70 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  fd>=0 ){.      o
31e80 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a  sUnlink(tPath);.
31e90 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
31ea0 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f  se(pFile, fd, __
31eb0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
31ec0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
31ed0 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72  r, "failed to br
31ee0 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  eak stale lock o
31ef0 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61  n %s, %s\n", cPa
31f00 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d  th, errmsg);.  }
31f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31f20 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71  ./* Take the req
31f30 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  uested lock on t
31f40 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e  he conch file an
31f50 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20  d break a stale 
31f60 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20  lock if the .** 
31f70 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e  host id matches.
31f80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
31f90 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  roxyConchLock(un
31fa0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
31fb0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20  uid_t myHostID, 
31fc0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20  int lockType){. 
31fd0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
31fe0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
31ff0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
32000 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
32010 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
32020 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
32030 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
32040 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
32050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
32060 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73   nTries = 0;.  s
32070 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63  truct timespec c
32080 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a  onchModTime;.  .
32090 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d    memset(&conchM
320a0 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f  odTime, 0, sizeo
320b0 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29  f(conchModTime))
320c0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ;.  do {.    rc 
320d0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
320e0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
320f0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
32100 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
32110 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a  .    nTries ++;.
32120 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32130 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
32140 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20   /* If the lock 
32150 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20  failed (busy):. 
32160 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a        * 1st try:
32170 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d   get the mod tim
32180 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20  e of the conch, 
32190 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72  wait 0.5s and tr
321a0 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20  y again. .      
321b0 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c   * 2nd try: fail
321c0 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65   if the mod time
321d0 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74   changed or host
321e0 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74   id is different
321f0 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a  , wait .       *
32200 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65             10 se
32210 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a  c and try again.
32220 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79         * 3rd try
32230 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  : break the lock
32240 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20   unless the mod 
32250 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64  time has changed
32260 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
32270 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
32280 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
32290 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  stat(conchFile->
322a0 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
322b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
322c0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
322d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
322e0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
322f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
32300 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
32310 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
32320 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66  nchModTime = buf
32330 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20  .st_mtimespec;. 
32340 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30         usleep(50
32350 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30  0000); /* wait 0
32360 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  .5 sec and try t
32370 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a  he lock again*/.
32380 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
32390 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
323a0 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
323b0 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  s>1 );.      if(
323c0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
323d0 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  _sec != buf.st_m
323e0 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20  timespec.tv_sec 
323f0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e  || .         con
32400 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65  chModTime.tv_nse
32410 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
32420 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b  espec.tv_nsec ){
32430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
32440 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
32450 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
32460 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20    if( nTries==2 
32470 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61  ){  .        cha
32480 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  r tBuf[PROXY_MAX
32490 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20  CONCHLEN];.     
324a0 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50     int len = osP
324b0 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
324c0 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d  h, tBuf, PROXY_M
324d0 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  AXCONCHLEN, 0);.
324e0 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c          if( len<
324f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
32500 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
32510 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
32520 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32530 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
32540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
32550 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54  f( len>PROXY_PAT
32560 48 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30  HINDEX && tBuf[0
32570 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43  ]==(char)PROXY_C
32580 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20  ONCHVERSION){.  
32590 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
325a0 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
325b0 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64  if the host id d
325c0 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a  oesn't match */.
325d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21            if( 0!
325e0 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52  =memcmp(&tBuf[PR
325f0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
32600 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f  myHostID, PROXY_
32610 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20  HOSTIDLEN) ){.  
32620 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
32630 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
32640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32660 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
32670 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68  k the lock on sh
32680 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65  ort read or a ve
32690 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a  rsion mismatch *
326a0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
326b0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
326c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
326d0 20 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30    usleep(1000000
326e0 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73  0); /* wait 10 s
326f0 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
32700 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ock again */.   
32710 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a       continue; .
32720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
32730 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72       assert( nTr
32740 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ies==3 );.      
32750 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61  if( 0==proxyBrea
32760 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  kConchLock(pFile
32770 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20  , myHostID) ){. 
32780 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32790 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
327a0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43  f( lockType==EXC
327b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
327c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
327d0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
327e0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
327f0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
32800 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
32810 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
32820 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
32830 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !rc ){.         
32840 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
32850 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
32860 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
32870 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
32880 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pe);.        }. 
32890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
328a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
328b0 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65  TE_BUSY && nTrie
328c0 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75  s<3 );.  .  retu
328d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b  rn rc;.}../* Tak
328e0 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20  es the conch by 
328f0 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20  taking a shared 
32900 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68  lock and read th
32910 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68  e contents conch
32920 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  , if .** lockPat
32930 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  h is non-NULL, t
32940 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c  he host ID and l
32950 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75  ock file path mu
32960 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c  st match.  A NUL
32970 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d  L .** lockPath m
32980 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f  eans that the lo
32990 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f  ckPath in the co
329a0 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
329b0 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a   used if the .**
329c0 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c   host IDs match,
329d0 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70   or a new lock p
329e0 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ath will be gene
329f0 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  rated automatica
32a00 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74  lly .** and writ
32a10 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68  ten to the conch
32a20 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
32a30 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f   int proxyTakeCo
32a40 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nch(unixFile *pF
32a50 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ile){.  proxyLoc
32a60 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
32a70 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
32a80 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
32a90 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
32aa0 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78  ; .  .  if( pCtx
32ab0 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29  ->conchHeld!=0 )
32ac0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32ad0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
32ae0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  .    unixFile *c
32af0 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
32b00 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20  >conchFile;.    
32b10 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b  uuid_t myHostID;
32b20 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20  .    int pError 
32b30 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65  = 0;.    char re
32b40 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  adBuf[PROXY_MAXC
32b50 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68  ONCHLEN];.    ch
32b60 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50  ar lockPath[MAXP
32b70 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  ATHLEN];.    cha
32b80 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  r *tempLockPath 
32b90 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
32ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32bb0 20 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f      int createCo
32bc0 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  nch = 0;.    int
32bd0 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30   hostIdMatch = 0
32be0 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65  ;.    int readLe
32bf0 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  n = 0;.    int t
32c00 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
32c10 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65  0;.    int force
32c20 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  NewLockPath = 0;
32c30 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43  .    .    OSTRAC
32c40 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25  E(("TAKECONCH  %
32c50 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
32c60 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
32c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,.             (
32c80 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
32c90 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
32ca0 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
32cb0 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29  to:"), getpid())
32cc0 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f  );..    rc = pro
32cd0 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f  xyGetHostID(myHo
32ce0 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a  stID, &pError);.
32cf0 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
32d00 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
32d10 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
32d20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72  lastErrno = pErr
32d30 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  or;.      goto e
32d40 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
32d50 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f    }.    rc = pro
32d60 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  xyConchLock(pFil
32d70 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41  e, myHostID, SHA
32d80 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
32d90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32da0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
32db0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
32dc0 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20    }.    /* read 
32dd0 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e  the existing con
32de0 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  ch file */.    r
32df0 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64  eadLen = seekAnd
32e00 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29  Read((unixFile*)
32e10 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65  conchFile, 0, re
32e20 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  adBuf, PROXY_MAX
32e30 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69  CONCHLEN);.    i
32e40 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a  f( readLen<0 ){.
32e50 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72        /* I/O err
32e60 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65  or: lastErrno se
32e70 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
32e80 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   */.      pFile-
32e90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e  >lastErrno = con
32ea0 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  chFile->lastErrn
32eb0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
32ec0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
32ed0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
32ee0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
32ef0 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e  else if( readLen
32f00 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  <=(PROXY_HEADERL
32f10 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
32f20 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  EN) || .        
32f30 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21       readBuf[0]!
32f40 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
32f50 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20  CHVERSION ){.   
32f60 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65     /* a short re
32f70 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f  ad or version fo
32f80 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65  rmat mismatch me
32f90 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
32fa0 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20  reate a new .   
32fb0 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65     ** conch file
32fc0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
32fd0 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20    createConch = 
32fe0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  1;.    }.    /* 
32ff0 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d  if the host id m
33000 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c  atches and the l
33010 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79  ock path already
33020 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63   exists in the c
33030 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c  onch.    ** we'l
33040 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  l try to use the
33050 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20   path there, if 
33060 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68  we can't open th
33070 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a  at path, we'll .
33080 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74      ** retry wit
33090 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e  h a new auto-gen
330a0 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20  erated path .   
330b0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20   */.    do { /* 
330c0 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20  in case we need 
330d0 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72  to try again for
330e0 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64   an :auto: named
330f0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20   lock file */.. 
33100 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65       if( !create
33110 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e  Conch && !forceN
33120 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ewLockPath ){.  
33130 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63        hostIdMatc
33140 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61  h = !memcmp(&rea
33150 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  dBuf[PROXY_HEADE
33160 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
33170 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
33180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33190 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44      PROXY_HOSTID
331a0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  LEN);.        /*
331b0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61   if the conch ha
331c0 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74  s data compare t
331d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  he contents */. 
331e0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78         if( !pCtx
331f0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
33200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
33210 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c  for auto-named l
33220 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20  ocal lock file, 
33230 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68  just check the h
33240 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c  ost ID and we'll
33250 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  .           ** u
33260 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  se the local loc
33270 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74  k file path that
33280 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  's already in th
33290 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ere.           *
332a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
332b0 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20  hostIdMatch ){. 
332c0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f             size_
332d0 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61  t pathLen = (rea
332e0 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54  dLen - PROXY_PAT
332f0 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20  HINDEX);.       
33300 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
33310 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d    if( pathLen>=M
33320 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20  AXPATHLEN ){.   
33330 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c             pathL
33340 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b  en=MAXPATHLEN-1;
33350 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33360 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
33370 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61  y(lockPath, &rea
33380 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49  dBuf[PROXY_PATHI
33390 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b  NDEX], pathLen);
333a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  .            loc
333b0 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d  kPath[pathLen] =
333c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
333d0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c  tempLockPath = l
333e0 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20  ockPath;.       
333f0 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50       tryOldLockP
33400 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ath = 1;.       
33410 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61       /* create a
33420 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63   copy of the loc
33430 6b 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f  k path if the co
33440 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  nch is taken */.
33450 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
33460 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
33470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33480 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f      }else if( ho
33490 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20  stIdMatch.      
334a0 20 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72           && !str
334b0 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50  ncmp(pCtx->lockP
334c0 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42  roxyPath, &readB
334d0 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  uf[PROXY_PATHIND
334e0 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EX],.           
334f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33500 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41  readLen-PROXY_PA
33510 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20  THINDEX).       
33520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
33530 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20   conch host and 
33540 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20  lock path match 
33550 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
33560 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
33570 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
33580 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
33590 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68   /* if the conch
335a0 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20   isn't writable 
335b0 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63  and doesn't matc
335c0 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65  h, we can't take
335d0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   it */.      if(
335e0 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65   (conchFile->ope
335f0 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d  nFlags&O_RDWR) =
33600 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  = 0 ){.        r
33610 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
33620 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
33630 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
33640 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
33650 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20    /* either the 
33660 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74  conch didn't mat
33670 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f  ch or we need to
33680 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
33690 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  e */.      if( !
336a0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
336b0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ath ){.        p
336c0 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28  roxyGetLockPath(
336d0 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f  pCtx->dbPath, lo
336e0 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
336f0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  EN);.        tem
33700 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
33710 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Path;.        /*
33720 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
33730 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  f the lock path 
33740 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f  _only_ if the co
33750 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  nch is taken */.
33760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
33770 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63       /* update c
33780 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61  onch with host a
33790 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69  nd path (this wi
337a0 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72  ll fail if other
337b0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a   process.      *
337c0 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c  * has a shared l
337d0 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66  ock already), if
337e0 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74   the host id mat
337f0 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69  ches, use the bi
33800 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b  g.      ** stick
33810 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33820 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69   futimes(conchFi
33830 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20  le->h, NULL);.  
33840 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
33850 74 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f  tch && !createCo
33860 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nch ){.        i
33870 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49  f( conchFile->pI
33880 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c  node && conchFil
33890 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
338a0 65 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>1 ){.        
338b0 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
338c0 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
338d0 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
338e0 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
338f0 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a  his.           *
33900 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
33910 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
33920 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
33930 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
33940 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
33950 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20        } else {  
33960 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
33970 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
33980 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
33990 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56  HostID, EXCLUSIV
339a0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
339b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
339c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
339d0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
339e0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
339f0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
33a00 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
33a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33a30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  K ){.        cha
33a40 72 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  r writeBuffer[PR
33a50 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
33a60 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72  ;.        int wr
33a70 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  iteSize = 0;.   
33a80 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72       .        wr
33a90 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28  iteBuffer[0] = (
33aa0 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
33ab0 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20  VERSION;.       
33ac0 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75   memcpy(&writeBu
33ad0 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45  ffer[PROXY_HEADE
33ae0 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
33af0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
33b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33b10 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
33b20 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th!=NULL ){.    
33b30 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77        strlcpy(&w
33b40 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
33b50 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74  _PATHINDEX], pCt
33b60 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
33b70 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
33b80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33b90 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28          strlcpy(
33ba0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
33bb0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74  XY_PATHINDEX], t
33bc0 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  empLockPath, MAX
33bd0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
33be0 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74    }.        writ
33bf0 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41  eSize = PROXY_PA
33c00 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e  THINDEX + strlen
33c10 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
33c20 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b  OXY_PATHINDEX]);
33c30 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
33c40 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46  ftruncate(conchF
33c50 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a  ile->h, writeSiz
33c60 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
33c70 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69   unixWrite((sqli
33c80 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68  te3_file *)conch
33c90 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65  File, writeBuffe
33ca0 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29  r, writeSize, 0)
33cb0 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28  ;.        fsync(
33cc0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20  conchFile->h);. 
33cd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
33ce0 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f  created a new co
33cf0 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75  nch file (not ju
33d00 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63  st updated the c
33d10 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20  ontents of a .  
33d20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20         ** valid 
33d30 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79  conch file), try
33d40 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65   to match the pe
33d50 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  rmissions of the
33d60 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
33d70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
33d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33d90 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20   && createConch 
33da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
33db0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
33dc0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
33dd0 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
33de0 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20  >h, &buf);.     
33df0 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20       if( err==0 
33e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
33e10 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75  ode_t cmode = bu
33e20 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55  f.st_mode&(S_IRU
33e30 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49  SR|S_IWUSR | S_I
33e40 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20  RGRP|S_IWGRP |. 
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e70 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53         S_IROTH|S
33e80 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20  _IWOTH);.       
33e90 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d       /* try to m
33ea0 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73  atch the databas
33eb0 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69  e file R/W permi
33ec0 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66  ssions, ignore f
33ed0 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65  ailure */.#ifnde
33ee0 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44  f SQLITE_PROXY_D
33ef0 45 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20  EBUG.           
33f00 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
33f10 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
33f20 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
33f30 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
33f40 20 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f      rc = osFchmo
33f50 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
33f60 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  cmode);.        
33f70 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
33f80 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45  (-1) && errno==E
33f90 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20  INTR );.        
33fa0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
33fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
33fc0 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
33fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
33fe0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33ff0 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44  fchmod %o FAILED
34000 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a   with %d %s\n",.
34010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34020 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64        cmode, cod
34030 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65  e, strerror(code
34040 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
34050 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
34060 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
34070 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
34080 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d  o SUCCEDED\n",cm
34090 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
340a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
340b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
340c0 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e   int code = errn
340d0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  o;.            f
340e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
340f0 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20  STAT FAILED[%d] 
34100 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a  with %d %s\n", .
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34120 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73      err, code, s
34130 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a  trerror(code));.
34140 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
34150 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
34160 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68     }.      conch
34170 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
34180 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
34190 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
341a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
341b0 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61       .    end_ta
341c0 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f  keconch:.      O
341d0 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
341e0 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e  OXY: CLOSE  %d\n
341f0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
34200 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34210 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
34220 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20  >openFlags ){.  
34230 20 20 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20        int fd;.  
34240 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
34250 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
34260 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
34270 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
34280 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
34290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46      }.        pF
342a0 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ile->h = -1;.   
342b0 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
342c0 5f 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61  _open(pCtx->dbPa
342d0 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  th, pFile->openF
342e0 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
342f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
34300 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
34310 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
34320 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
34330 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e  TRANSPROXY: OPEN
34340 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20    %d\n", fd));. 
34350 20 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30         if( fd>=0
34360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
34370 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20  ile->h = fd;.   
34380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34390 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f        rc=SQLITE_
343a0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f  CANTOPEN_BKPT; /
343b0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70  * SQLITE_BUSY? p
343c0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61  roxyTakeConch ca
343d0 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  lled.           
343e0 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a  during locking *
343f0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
34400 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
34410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
34420 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20  pCtx->lockProxy 
34430 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
34440 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b  *path = tempLock
34450 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50  Path ? tempLockP
34460 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath : pCtx->lock
34470 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
34480 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
34490 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68  ateUnixFile(path
344a0 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  , &pCtx->lockPro
344b0 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  xy, 1);.        
344c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
344d0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
344e0 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c  NOMEM && tryOldL
344f0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
34500 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
34510 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20 70  n't create the p
34520 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77  roxy lock file w
34530 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b  ith the old lock
34540 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20   file path.     
34550 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20        ** so try 
34560 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e  again via auto-n
34570 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20  aming .         
34580 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66    */.          f
34590 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
345a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
345b0 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
345c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
345d0 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63  tinue; /* go bac
345e0 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77  k to the do {} w
345f0 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74  hile start point
34600 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20  , try again */. 
34610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34620 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
34630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34640 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
34650 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61  ake a copy of pa
34660 74 68 20 69 66 20 77 65 20 65 78 74 72 61 63 74  th if we extract
34670 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  ed the value.   
34680 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
34690 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20  e conch file or 
346a0 74 68 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c  the path was all
346b0 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74  ocated on the st
346c0 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  ack.         */.
346d0 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d 70          if( temp
346e0 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
346f0 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
34700 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
34710 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 74  te3DbStrDup(0, t
34720 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  empLockPath);.  
34730 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
34740 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
34770 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
34780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34790 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
347a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
347b0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
347c0 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  eld = 1;.       
347d0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43   .        if( pC
347e0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  tx->lockProxy->p
347f0 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f  Method == &afpIo
34800 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
34810 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43       afpLockingC
34820 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a  ontext *afpCtx;.
34830 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78            afpCtx
34840 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
34850 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f  ntext *)pCtx->lo
34860 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67  ckProxy->locking
34870 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
34880 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74     afpCtx->dbPat
34890 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
348a0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
348b0 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
348c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46  {.        conchF
348d0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
348e0 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
348f0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
34900 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
34910 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
34920 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
34930 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
34940 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
34950 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
34960 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29  K?"ok":"failed")
34970 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
34980 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20  rc;.    } while 
34990 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20  (1); /* in case 
349a0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79  we need to retry
349b0 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b   the :auto: lock
349c0 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20   file - .       
349d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20            ** we 
349e0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74  should never get
349f0 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69 61   here except via
34a00 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20   the 'continue' 
34a10 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  call. */.  }.}..
34a20 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68  /*.** If pFile h
34a30 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  olds a lock on a
34a40 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65   conch file, the
34a50 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c  n release that l
34a60 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
34a70 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43  nt proxyReleaseC
34a80 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
34a90 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  File){.  int rc 
34aa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
34ab0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
34ac0 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ne return code *
34ad0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  /.  proxyLocking
34ae0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20  Context *pCtx;  
34af0 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63  /* The locking c
34b00 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 70  ontext for the p
34b10 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  roxy lock */.  u
34b20 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
34b30 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  le;        /* Na
34b40 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
34b50 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20  file */..  pCtx 
34b60 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
34b70 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
34b80 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
34b90 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43    conchFile = pC
34ba0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
34bb0 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41   OSTRACE(("RELEA
34bc0 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20  SECONCH  %d for 
34bd0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f  %s pid=%d\n", co
34be0 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
34bf0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
34c00 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
34c10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34c20 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a  h : ":auto:"), .
34c30 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
34c40 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74  d()));.  if( pCt
34c50 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
34c60 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
34c70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
34c80 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
34c90 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
34ca0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
34cb0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
34cc0 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28   = 0;.  OSTRACE(
34cd0 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
34ce0 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
34cf0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
34d00 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f     (rc==SQLITE_O
34d10 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
34d20 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ed")));.  return
34d30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
34d40 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
34d50 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
34d60 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d   compute the nam
34d70 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66  e of its conch f
34d80 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ile..** Store th
34d90 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
34da0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
34db0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
34dc0 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61  _malloc()..** Ma
34dd0 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70  ke *pConchPath p
34de0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
34df0 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51  name.  Return SQ
34e00 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
34e10 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ss.** or SQLITE_
34e20 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20  NOMEM if unable 
34e30 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79  to obtain memory
34e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
34e50 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
34e60 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
34e70 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  hat the allocate
34e80 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  d memory.** spac
34e90 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  e is eventually 
34ea0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43  freed..**.** *pC
34eb0 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20  onchPath is set 
34ec0 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d  to NULL if a mem
34ed0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
34ee0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
34ef0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
34f00 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
34f10 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68  ame(char *dbPath
34f20 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50  , char **pConchP
34f30 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ath){.  int i;  
34f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
34f60 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  unter */.  int l
34f70 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
34f80 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e  (dbPath); /* Len
34f90 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  gth of database 
34fa0 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74  filename - dbPat
34fb0 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  h */.  char *con
34fc0 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  chPath;         
34fd0 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69       /* buffer i
34fe0 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  n which to const
34ff0 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20  ruct conch name 
35000 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
35010 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
35020 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61  conch filename a
35030 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
35040 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74  e name to.  ** t
35050 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
35060 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
35070 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70   file. */  .  *p
35080 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63  ConchPath = conc
35090 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  hPath = (char *)
350a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c  sqlite3_malloc(l
350b0 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63  en + 8);.  if( c
350c0 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20  onchPath==0 ){. 
350d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
350e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
350f0 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  mcpy(conchPath, 
35100 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
35110 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
35120 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
35130 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
35140 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
35150 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
35160 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
35170 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
35180 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
35190 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
351a0 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
351b0 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
351c0 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
351d0 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
351e0 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
351f0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70  ++;.  }..  /* ap
35200 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68  pend the "-conch
35210 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20  " suffix to the 
35220 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  file */.  memcpy
35230 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d  (&conchPath[i+1]
35240 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a  , "-conch", 7);.
35250 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
35260 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
35270 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
35280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35290 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
352a0 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
352b0 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
352c0 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
352d0 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
352e0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
352f0 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
35300 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
35310 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
35320 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
35330 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
35340 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
35350 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
35360 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35370 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
35380 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
35390 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
353a0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
353b0 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  h;.  int rc = SQ
353c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
353d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
353e0 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
353f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
35400 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a  USY;.  }  ..  /*
35410 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69   nothing to do i
35420 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55  f the path is NU
35430 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61  LL, :auto: or ma
35440 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69  tches the existi
35450 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28  ng path */.  if(
35460 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
35470 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
35480 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
35490 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61  ") ||.    (oldPa
354a0 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f  th && !strncmp(o
354b0 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41  ldPath, path, MA
354c0 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20  XPATHLEN)) ){.  
354d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
354e0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
354f0 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
35500 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
35510 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78  kProxy;.    pCtx
35520 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c  ->lockProxy=NULL
35530 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63  ;.    pCtx->conc
35540 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69  hHeld = 0;.    i
35550 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55  f( lockProxy!=NU
35560 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  LL ){.      rc=l
35570 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
35580 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
35590 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72  e3_file *)lockPr
355a0 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
355b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
355c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
355d0 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
355e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
355f0 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a  _free(oldPath);.
35600 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
35610 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
35620 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74  3DbStrDup(0, pat
35630 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74  h);.  }.  .  ret
35640 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
35650 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65   pFile is a file
35660 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
35670 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72  pened by a prior
35680 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62   xOpen call.  db
35690 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72  Path.** is a str
356a0 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65  ing buffer at le
356b0 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ast MAXPATHLEN+1
356c0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73   characters in s
356d0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
356e0 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65  routine find the
356f0 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69   filename associ
35700 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20  ated with pFile 
35710 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a  and writes it.**
35720 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a   int dbPath..*/.
35730 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35740 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
35750 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
35760 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
35770 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  th){.#if defined
35780 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66  (__APPLE__).  if
35790 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
357a0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
357b0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20  s ){.    /* afp 
357c0 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65  style keeps a re
357d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64  ference to the d
357e0 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69  b path in the fi
357f0 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20  lePath field .  
35800 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75    ** of the stru
35810 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ct */.    assert
35820 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ( (int)strlen((c
35830 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
35840 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
35850 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
35860 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
35870 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
35880 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
35890 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50  ingContext)->dbP
358a0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
358b0 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69  ;.  } else.#endi
358c0 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  f.  if( pFile->p
358d0 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f  Method == &dotlo
358e0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
358f0 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73     /* dot lock s
35900 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f  tyle uses the lo
35910 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
35920 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c   store the dot l
35930 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ock.    ** file 
35940 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
35950 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  len = strlen((ch
35960 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
35970 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74  ingContext) - st
35980 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46  rlen(DOTLOCK_SUF
35990 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  FIX);.    memcpy
359a0 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a  (dbPath, (char *
359b0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
359c0 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29  ontext, len + 1)
359d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
359e0 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c  * all other styl
359f0 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69  es use the locki
35a00 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
35a10 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ore the db file 
35a20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65  path */.    asse
35a30 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72  rt( strlen((char
35a40 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35a50 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54  Context)<=MAXPAT
35a60 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c  HLEN );.    strl
35a70 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
35a80 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
35a90 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41  ngContext, MAXPA
35aa0 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  THLEN);.  }.  re
35ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61  }../*.** Takes a
35ad0 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64  n already filled
35ae0 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e   in unix file an
35af0 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61  d alters it so a
35b00 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ll file locking 
35b10 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66  .** will be perf
35b20 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63  ormed on the loc
35b30 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  al proxy lock fi
35b40 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  le.  The followi
35b50 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65  ng fields.** are
35b60 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68   preserved in th
35b70 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
35b80 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  t so that they c
35b90 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  an be restored a
35ba0 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20  nd .** the unix 
35bb0 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72  structure proper
35bc0 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74  ly cleaned up at
35bd0 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20   close time:.** 
35be0 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78   ->lockingContex
35bf0 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a  t.**  ->pMethod.
35c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35c10 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
35c20 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
35c30 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
35c40 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
35c50 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35c60 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62  *pCtx;.  char db
35c70 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
35c80 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  1];       /* Nam
35c90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
35ca0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
35cb0 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b   *lockPath=NULL;
35cc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35cd0 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
35ce0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
35cf0 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
35d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
35d10 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79  USY;.  }.  proxy
35d20 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
35d30 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61  File(pFile, dbPa
35d40 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68  th);.  if( !path
35d50 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30   || path[0]=='\0
35d60 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74  ' || !strcmp(pat
35d70 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a  h, ":auto:") ){.
35d80 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c      lockPath=NUL
35d90 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
35da0 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a  lockPath=(char *
35db0 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20  )path;.  }.  .  
35dc0 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
35dd0 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73 20  ROXY  %d for %s 
35de0 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
35df0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
35e00 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b  (lockPath ? lock
35e10 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
35e20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
35e30 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
35e40 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
35e50 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70  pCtx) );.  if( p
35e60 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Ctx==0 ){.    re
35e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
35e80 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
35e90 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCtx, 0, sizeof(
35ea0 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d  *pCtx));..  rc =
35eb0 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
35ec0 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68  hPathname(dbPath
35ed0 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
35ee0 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72  lePath);.  if( r
35ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35f00 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
35f10 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74  eateUnixFile(pCt
35f20 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
35f30 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
35f40 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  le, 0);.    if( 
35f50 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
35f60 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  PEN && ((pFile->
35f70 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
35f80 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20  ) == 0) ){.     
35f90 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f   /* if (a) the o
35fa0 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f  pen flags are no
35fb0 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68  t O_RDWR, (b) th
35fc0 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68  e conch isn't th
35fd0 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ere, and.      *
35fe0 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73  * (c) the file s
35ff0 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e  ystem is read-on
36000 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20  ly, then enable 
36010 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73  no-locking acces
36020 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c  s..      ** Ugh,
36030 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d   since O_RDONLY=
36040 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20  =0x0000 we test 
36050 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63  for !O_RDWR sinc
36060 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72  e unixOpen asser
36070 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ts.      ** that
36080 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20   openFlags will 
36090 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66  have only one of
360a0 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52   O_RDONLY or O_R
360b0 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  DWR..      */.  
360c0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66      struct statf
360d0 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
360e0 73 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63  struct stat conc
360f0 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  hInfo;.      int
36100 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b   goLockless = 0;
36110 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 73 53 74  ..      if( osSt
36120 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  at(pCtx->conchFi
36130 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e  lePath, &conchIn
36140 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20  fo) == -1 ) {.  
36150 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
36160 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69  errno;.        i
36170 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29  f( (err==ENOENT)
36180 20 26 26 20 28 73 74 61 74 66 73 28 64 62 50 61   && (statfs(dbPa
36190 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
361a0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
361b0 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66   goLockless = (f
361c0 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
361d0 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54  T_RDONLY) == MNT
361e0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
361f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
36200 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20   if( goLockless 
36210 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
36220 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b  >conchHeld = -1;
36230 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53   /* read only FS
36240 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  / lockless */.  
36250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
36260 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
36270 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20    }.  }  .  if( 
36280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36290 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20   lockPath ){.   
362a0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
362b0 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
362c0 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61  StrDup(0, lockPa
362d0 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  th);.  }..  if( 
362e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
362f0 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74  .    pCtx->dbPat
36300 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
36310 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a  Dup(0, dbPath);.
36320 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62      if( pCtx->db
36330 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  Path==NULL ){.  
36340 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36350 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
36360 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61  E_OK ){.    /* a
36380 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  ll memory is all
36390 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61  ocated, proxys a
363a0 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  re created and a
363b0 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a  ssigned, .    **
363c0 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b   switch the lock
363d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20  ing context and 
363e0 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74  pMethod then ret
363f0 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urn..    */.    
36400 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67  pCtx->oldLocking
36410 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d  Context = pFile-
36420 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36430 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
36440 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
36450 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c  x;.    pCtx->pOl
36460 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d  dMethod = pFile-
36470 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46  >pMethod;.    pF
36480 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
36490 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a  proxyIoMethods;.
364a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
364b0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
364c0 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d   ){ .      pCtx-
364d0 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74  >conchFile->pMet
364e0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
364f0 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78  ite3_file *)pCtx
36500 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
36510 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
36520 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
36530 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
36540 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43  ite3DbFree(0, pC
36550 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
36560 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
36570 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
36580 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20  FilePath); .    
36590 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
365a0 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  x);.  }.  OSTRAC
365b0 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E(("TRANSPROXY  
365c0 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
365d0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
365e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
365f0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
36600 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
36610 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
36620 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20  routine handles 
36630 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
36640 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61  trol() calls tha
36650 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a  t are specific.*
36660 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69  * to proxy locki
36670 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
36680 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
36690 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
366a0 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
366b0 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
366c0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
366d0 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
366e0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
366f0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
36700 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
36710 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  *)id;.      if( 
36720 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
36730 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
36740 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  s ){.        pro
36750 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36760 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
36770 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
36780 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36790 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72  text;.        pr
367a0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
367b0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
367c0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
367d0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
367e0 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
367f0 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c  *)pArg = pCtx->l
36800 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
36810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36820 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
36830 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a  har **)pArg = ":
36840 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29  auto: (not held)
36850 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
36860 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
36870 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
36880 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b   **)pArg = NULL;
36890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
368a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
368b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
368c0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
368d0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
368e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
368f0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
36900 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  d;.      int rc 
36910 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
36920 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74     int isProxySt
36930 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d  yle = (pFile->pM
36940 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
36950 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20  oMethods);.     
36960 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20   if( pArg==NULL 
36970 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  || (const char *
36980 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  )pArg==0 ){.    
36990 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
369a0 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
369b0 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
369c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f  oxy locking - no
369d0 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20  t supported */. 
369e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
369f0 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c  LITE_ERROR /*SQL
36a00 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51  ITE_PROTOCOL? SQ
36a10 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a  LITE_MISUSE?*/;.
36a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
36a30 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
36a40 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69   off proxy locki
36a50 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66  ng - already off
36a60 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20   - NOOP */.     
36a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
36a80 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
36a90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36aa0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36ab0 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e  proxyPath = (con
36ac0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a  st char *)pArg;.
36ad0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72          if( isPr
36ae0 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  oxyStyle ){.    
36af0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
36b00 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
36b10 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  = .            (
36b20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36b30 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
36b40 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
36b50 20 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d        if( !strcm
36b60 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22  p(pArg, ":auto:"
36b70 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
36b80 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
36b90 79 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20  yPath &&.       
36ba0 20 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70          !strncmp
36bb0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
36bc0 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c  Path, proxyPath,
36bd0 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20   MAXPATHLEN)).  
36be0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
36bf0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
36c00 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
36c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36c20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c      rc = switchL
36c30 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69  ockProxyPath(pFi
36c40 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  le, proxyPath);.
36c50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36c70 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20       /* turn on 
36c80 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
36c90 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
36ca0 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
36cb0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c  ormUnixFile(pFil
36cc0 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
36cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
36cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
36d00 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
36d10 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68  ert( 0 );  /* Th
36d20 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74  e call assures t
36d30 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f  hat only valid o
36d40 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20  pcodes are sent 
36d50 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  */.    }.  }.  /
36d60 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
36d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
36d80 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  ROR;.}../*.** Wi
36d90 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69  thin this divisi
36da0 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67  on (the proxying
36db0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
36dc0 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f  ntation) the pro
36dd0 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65  cedures.** above
36de0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
36df0 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20  all utilities.  
36e00 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64  The lock-related
36e10 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a   methods of the.
36e20 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  ** proxy-locking
36e30 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
36e40 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77  od object follow
36e50 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ..*/.../*.** Thi
36e60 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
36e70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
36e80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
36e90 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
36ea0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
36eb0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
36ec0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
36ed0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
36ee0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
36ef0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
36f00 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
36f10 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
36f20 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
36f30 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
36f40 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
36f50 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
36f60 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
36f70 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
36f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36f90 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
36fa0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
36fb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
36fc0 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46  esOut) {.  unixF
36fd0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
36fe0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
36ff0 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
37000 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
37010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37020 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
37030 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
37040 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
37050 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
37060 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37070 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
37080 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
37090 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
370a0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
370b0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
370c0 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65  eturn proxy->pMe
370d0 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65  thod->xCheckRese
370e0 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65  rvedLock((sqlite
370f0 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70  3_file*)proxy, p
37100 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ResOut);.    }el
37110 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64  se{ /* conchHeld
37120 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
37130 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75   */.      pResOu
37140 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t=0;.    }.  }. 
37150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37160 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
37170 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
37180 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
37190 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
371a0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
371b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
371c0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
371d0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
371e0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
371f0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
37200 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
37210 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
37220 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
37230 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
37240 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
37250 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
37260 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
37270 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
37280 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
37290 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
372a0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
372b0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
372c0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
372d0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
372e0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
372f0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
37300 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
37310 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
37320 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
37330 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
37340 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
37350 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
37360 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
37370 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
37380 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
37390 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
373a0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
373b0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
373c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
373d0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
373e0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
373f0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
37400 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
37410 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
37420 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
37430 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
37440 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
37450 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
37460 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
37470 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
37480 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37490 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
374a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
374b0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
374c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
374d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
374e0 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
374f0 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
37500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37510 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
37520 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37530 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
37540 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
37550 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
37560 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
37570 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
37580 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
37590 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
375a0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
375b0 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65   rc = proxy->pMe
375c0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
375d0 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
375e0 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  , eFileLock);.  
375f0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
37600 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46  Lock = proxy->eF
37610 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  ileLock;.    }el
37620 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
37630 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
37640 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
37650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37660 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
37670 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
37680 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
37690 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
376a0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
376b0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
376c0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
376d0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
376e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
376f0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
37700 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37710 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
37720 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
37730 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
37740 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
37750 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
37760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37770 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
37780 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
37790 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
377a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
377b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
377c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
377d0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
377e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
377f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
37800 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37810 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
37820 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37830 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
37840 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
37850 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
37860 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
37870 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
37880 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
37890 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
378a0 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
378b0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
378c0 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b  proxy, eFileLock
378d0 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
378e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78  eFileLock = prox
378f0 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  y->eFileLock;.  
37900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
37910 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20  * conchHeld < 0 
37920 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  is lockless */. 
37930 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
37940 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
37950 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61 74  lose a file that
37960 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b   uses proxy lock
37970 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
37980 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
37990 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
379a0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
379b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
379c0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
379d0 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
379e0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
379f0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
37a00 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
37a10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
37a20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63     unixFile *loc
37a30 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  kProxy = pCtx->l
37a40 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e  ockProxy;.    un
37a50 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
37a60 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
37a70 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ile;.    int rc 
37a80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
37a90 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72   .    if( lockPr
37aa0 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
37ab0 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  = lockProxy->pMe
37ac0 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
37ad0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
37ae0 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29  kProxy, NO_LOCK)
37af0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
37b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37b10 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
37b20 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
37b30 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
37b40 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  )lockProxy);.   
37b50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
37b60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
37b70 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72  ite3_free(lockPr
37b80 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78  oxy);.      pCtx
37b90 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b  ->lockProxy = 0;
37ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
37bb0 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20  onchFile ){.    
37bc0 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
37bd0 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  hHeld ){.       
37be0 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61   rc = proxyRelea
37bf0 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  seConch(pFile);.
37c00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
37c10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37c20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63    }.      rc = c
37c30 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
37c40 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
37c50 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
37c60 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
37c70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
37c80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
37c90 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  e(conchFile);.  
37ca0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
37cb0 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c  bFree(0, pCtx->l
37cc0 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20  ockProxyPath);. 
37cd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
37ce0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
37cf0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
37d00 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d  3DbFree(0, pCtx-
37d10 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a  >dbPath);.    /*
37d20 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69   restore the ori
37d30 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f  ginal locking co
37d40 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
37d50 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20  d then close it 
37d60 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  */.    pFile->lo
37d70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
37d80 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43  Ctx->oldLockingC
37d90 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c  ontext;.    pFil
37da0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74  e->pMethod = pCt
37db0 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20  x->pOldMethod;. 
37dc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
37dd0 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72  pCtx);.    retur
37de0 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  n pFile->pMethod
37df0 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20  ->xClose(id);.  
37e00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
37e10 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69  E_OK;.}....#endi
37e20 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
37e30 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
37e40 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
37e50 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
37e60 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
37e70 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e  g style is inten
37e80 64 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68  ded for use with
37e90 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73   AFP filesystems
37ea0 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41  ..** And since A
37eb0 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f  FP is only suppo
37ec0 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20  rted on MacOSX, 
37ed0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  the proxy lockin
37ee0 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73  g is also.** res
37ef0 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53  tricted to MacOS
37f00 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  X..** .**.******
37f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
37f20 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  d of the proxy l
37f30 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
37f40 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
37f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
37f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37fa0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
37fb0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
37fc0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
37fd0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
37fe0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
37ff0 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53  egisters all VFS
38000 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
38010 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f   for unix-like o
38020 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
38030 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ems.  This routi
38040 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ne, and the sqli
38050 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75  te3_os_end() rou
38060 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  tine that follow
38070 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  s,.** should be 
38080 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65  the only routine
38090 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74  s in this file t
380a0 68 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20  hat are visible 
380b0 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69  from other.** fi
380c0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
380d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
380e0 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51  d once during SQ
380f0 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  Lite initializat
38100 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20  ion and by a.** 
38110 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20  single thread.  
38120 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  The memory alloc
38130 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20  ation and mutex 
38140 73 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20  subsystems have 
38150 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69  not.** necessari
38160 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ly been initiali
38170 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f  zed when this ro
38180 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
38190 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20   and so they.** 
381a0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73  should not be us
381b0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
381c0 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29  e3_os_init(void)
381d0 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68  { .  /* .  ** Th
381e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
381f0 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69  o defines an ini
38200 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20  tializer for an 
38210 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
38220 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d  ct..  ** The nam
38230 65 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20  e of the VFS is 
38240 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44  NAME.  The pAppD
38250 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
38260 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20   to a pointer.  
38270 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65  ** to the "finde
38280 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70  r" function.  (p
38290 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69  AppData is a poi
382a0 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65  nter to a pointe
382b0 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  r because.  ** s
382c0 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70  illy C90 rules p
382d0 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20  rohibit a void* 
382e0 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20  from being cast 
382f0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
38300 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73  inter.  ** and s
38310 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20  o we have to go 
38320 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65  through the inte
38330 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72  rmediate pointer
38340 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
38350 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  ms.  ** when com
38360 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64  piling with -ped
38370 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20  antic-errors on 
38380 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  GCC.).  **.  ** 
38390 54 68 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d  The FINDER param
383a0 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63  eter to this mac
383b0 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ro is the name o
383c0 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f  f the pointer to
383d0 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72   the.  ** finder
383e0 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20  -function.  The 
383f0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
38400 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
38410 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71  r to the.  ** sq
38420 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  lite_io_methods 
38430 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
38440 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72  ements the desir
38450 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  ed locking.  ** 
38460 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20  behaviors.  See 
38470 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f  the division abo
38480 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ve that contains
38490 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20   the IOMETHODS. 
384a0 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64   ** macro for ad
384b0 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  dition informati
384c0 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e  on on finder-fun
384d0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ctions..  **.  *
384e0 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73  * Most finders s
384f0 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70  imply return a p
38500 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
38510 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
38520 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hods.  ** object
38530 2e 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f  .  But the "auto
38540 6c 6f 63 6b 49