/ Hex Artifact Content
Login

Artifact 497e355ab617a875bf45f4d58bacca82952339d5:


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 73 68 6f 72  .  unsigned shor
1b90: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int 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 23 64  le locking */.#d
24d0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 43  efine UNIXFILE_C
24e0: 48 4f 57 4e 20 20 20 20 20 20 30 78 31 30 30 20  HOWN      0x100 
24f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 77 6e 65      /* File owne
2500: 72 73 68 69 70 20 77 61 73 20 63 68 61 6e 67 65  rship was change
2510: 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  d */../*.** Incl
2520: 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73  ude code that is
2530: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f   common to all o
2540: 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23  s_*.c files.*/.#
2550: 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d  include "os_comm
2560: 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  on.h"../*.** Def
2570: 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72  ine various macr
2580: 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  os that are miss
2590: 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79  ing from some sy
25a0: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
25b0: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
25c0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
25d0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  LE 0.#endif.#ifd
25e0: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
25f0: 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f  E_LFS.# undef O_
2600: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
2610: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
2620: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2630: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66  O_NOFOLLOW.# def
2640: 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30  ine O_NOFOLLOW 0
2650: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2660: 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e  O_BINARY.# defin
2670: 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e  e O_BINARY 0.#en
2680: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
2690: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
26a0: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
26b0: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
26c0: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
26d0: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
26e0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
26f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2700: 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  FE.#define threa
2710: 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66  did pthread_self
2720: 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  ().#else.#define
2730: 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64   threadid 0.#end
2740: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72  if../*.** Differ
2750: 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73  ent Unix systems
2760: 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20   declare open() 
2770: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  in different way
2780: 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20  s.  Same use.** 
2790: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
27a0: 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f  ,int,mode_t).  O
27b0: 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63  thers use open(c
27c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e  onst char*,int,.
27d0: 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..)..** The diff
27e0: 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74  erence is import
27f0: 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61  ant when using a
2800: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2810: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2820: 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74  The safest way t
2830: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  o deal with the 
2840: 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c  problem is to al
2850: 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72  ways use this wr
2860: 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61  apper.** which a
2870: 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61  lways has the sa
2880: 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20  me well-defined 
2890: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
28a0: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70  atic int posixOp
28b0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
28c0: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c  File, int flags,
28d0: 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65   int mode){.  re
28e0: 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c  turn open(zFile,
28f0: 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d   flags, mode);.}
2900: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2910: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2920: 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
2930: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  ry(const char*, 
2940: 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  int*);../*.** Ma
2950: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
2960: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
2970: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
2980: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
2990: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
29a0: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
29b0: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
29c0: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
29d0: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
29e0: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
29f0: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
2a00: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
2a10: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
2a20: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
2a30: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
2a40: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
2a50: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
2a60: 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  nix_syscall {.  
2a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2a80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2a90: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74   Name of the syt
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 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
2ad0: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
2ae0: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2af0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2b00: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
2b10: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
2b20: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
2b30: 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e  [] = {.  { "open
2b40: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
2b50: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2b60: 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d  posixOpen,  0  }
2b70: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
2b80: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
2b90: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69  onst char*,int,i
2ba0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  nt))aSyscall[0].
2bb0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2bc0: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28  close",        (
2bd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2be0: 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20  ptr)close,      
2bf0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2c00: 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28  Close     ((int(
2c10: 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  *)(int))aSyscall
2c20: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [1].pCurrent).. 
2c30: 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20   { "access",    
2c40: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2c50: 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20  all_ptr)access, 
2c60: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2c70: 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28  e osAccess    ((
2c80: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
2c90: 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  r*,int))aSyscall
2ca0: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
2cb0: 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20   { "getcwd",    
2cc0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2cd0: 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20  all_ptr)getcwd, 
2ce0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2cf0: 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28  e osGetcwd    ((
2d00: 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73  char*(*)(char*,s
2d10: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
2d20: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
2d30: 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20  { "stat",       
2d40: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2d50: 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20  ll_ptr)stat,    
2d60: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
2d70: 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69   osStat      ((i
2d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
2d90: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
2da0: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
2db0: 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rent)../*.** The
2dc0: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
2dd0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
2de0: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
2df0: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
2e00: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
2e10: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
2e20: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
2e30: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
2e40: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
2e50: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
2e60: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
2e70: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
2e80: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
2e90: 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f  P.  But it is DO
2ea0: 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75  S - what did you
2eb0: 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64   expect?.*/.#ifd
2ec0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b  ef __DJGPP__.  {
2ed0: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
2ee0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ef0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2f00: 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29  e osFstat(a,b,c)
2f10: 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20      0.#else     
2f20: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2f30: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2f40: 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c  scall_ptr)fstat,
2f50: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2f60: 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20  ine osFstat     
2f70: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72  ((int(*)(int,str
2f80: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
2f90: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
2fa0: 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74  .#endif..  { "ft
2fb0: 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71  runcate",    (sq
2fc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2fd0: 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20  r)ftruncate,  0 
2fe0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74   },.#define osFt
2ff0: 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29  runcate ((int(*)
3000: 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  (int,off_t))aSys
3010: 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74  call[6].pCurrent
3020: 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20  )..  { "fcntl", 
3030: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3040: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74  syscall_ptr)fcnt
3050: 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  l,      0  },.#d
3060: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20  efine osFcntl   
3070: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69    ((int(*)(int,i
3080: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
3090: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [7].pCurrent).. 
30a0: 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20   { "read",      
30b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
30c0: 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20  all_ptr)read,   
30d0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
30e0: 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28  e osRead      ((
30f0: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3100: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3110: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
3120: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3130: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
3140: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
3150: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
3160: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3170: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3180: 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30  tr)pread,      0
3190: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
31a0: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
31b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
31c0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
31d0: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
31e0: 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20  fine osPread    
31f0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3200: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3210: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39  ff_t))aSyscall[9
3220: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3230: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3240: 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64  AD64).  { "pread
3250: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3260: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3270: 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c  read64,    0  },
3280: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
3290: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
32a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
32b0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
32c0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
32d0: 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73   osPread64   ((s
32e0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
32f0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3300: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
3310: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77  Current)..  { "w
3320: 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73  rite",        (s
3330: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3340: 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30  tr)write,      0
3350: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57    },.#define osW
3360: 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65  rite     ((ssize
3370: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
3380: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3390: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
33a0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
33b0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
33c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
33d0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
33e0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
33f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3400: 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20  _ptr)pwrite,    
3410: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
3420: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
3430: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3440: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3450: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
3460: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20  define osPwrite 
3470: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3480: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3490: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d      aSyscall[12]
34c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
34d0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
34e0: 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65  D64).  { "pwrite
34f0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3500: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
3510: 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a  rite64,   0  },.
3520: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
3530: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
3540: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3550: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3560: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3570: 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73  osPwrite64  ((ss
3580: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
3590: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
35a0: 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20  off_t))\.       
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79               aSy
35c0: 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65  scall[13].pCurre
35d0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
35e0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
35f0: 54 59 4c 45 0a 20 20 7b 20 22 66 63 68 6d 6f 64  TYLE.  { "fchmod
3600: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3610: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
3620: 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  hmod,     0  },.
3630: 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6d 6f  #else.  { "fchmo
3640: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3650: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3660: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3670: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3680: 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e  osFchmod    ((in
3690: 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29  t(*)(int,mode_t)
36a0: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
36b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
36c0: 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
36d0: 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
36e0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
36f0: 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74  TE.  { "fallocat
3700: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
3710: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
3720: 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20  x_fallocate,  0 
3730: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61  },.#else.  { "fa
3740: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
3750: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3760: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
3770: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3780: 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63  #define osFalloc
3790: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
37a0: 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53  ,off_t,off_t))aS
37b0: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
37c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e  ent)..  { "unlin
37d0: 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  k",       (sqlit
37e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
37f0: 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20  nlink,          
3800: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3810: 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28  Unlink    ((int(
3820: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  *)(const char*))
3830: 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75  aSyscall[16].pCu
3840: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65  rrent)..  { "ope
3850: 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20  nDirectory",    
3860: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3870: 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f  _ptr)openDirecto
3880: 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64  ry,      0 },.#d
3890: 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65  efine osOpenDire
38a0: 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63  ctory ((int(*)(c
38b0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29  onst char*,int*)
38c0: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
38d0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b  urrent)..  { "mk
38e0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
38f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3900: 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20  r)mkdir,        
3910: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3920: 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e  osMkdir     ((in
3930: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3940: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3950: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
3960: 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20  .  { "rmdir",   
3970: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3980: 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c  scall_ptr)rmdir,
3990: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
39a0: 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20  #define osRmdir 
39b0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
39c0: 73 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61  st char*))aSysca
39d0: 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[19].pCurrent)
39e0: 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ..  { "fchown", 
39f0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3a00: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3a10: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3a20: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77  .#define osFchow
3a30: 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  n    ((int(*)(in
3a40: 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61  t,uid_t,gid_t))a
3a50: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
3a60: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6d 61 73  rent)..  { "umas
3a70: 6b 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  k",        (sqli
3a80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3a90: 75 6d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  umask,          
3aa0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3ab0: 55 6d 61 73 6b 20 20 20 20 20 28 28 6d 6f 64 65  Umask     ((mode
3ac0: 5f 74 28 2a 29 28 6d 6f 64 65 5f 74 29 29 61 53  _t(*)(mode_t))aS
3ad0: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3ae0: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
3af0: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
3b00: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
3b10: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
3b20: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
3b30: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
3b40: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
3b50: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
3b60: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
3b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3b80: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
3b90: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
3ba0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
3bb0: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
3bc0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
3bd0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
3be0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
3bf0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
3c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c10: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
3c20: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
3c30: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
3c40: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
3c50: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
3c60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3c70: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
3c80: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
3c90: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
3ca0: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
3cb0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3cc0: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
3cd0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
3ce0: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
3cf0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3d00: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
3d10: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3d20: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3d30: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
3d40: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3d50: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
3d60: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
3d70: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
3d80: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
3d90: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
3da0: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
3db0: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
3dc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3dd0: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
3de0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
3df0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
3e00: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
3e10: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
3e20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
3e30: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
3e40: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
3e50: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3e60: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
3e70: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3e80: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
3e90: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
3ea0: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
3eb0: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
3ec0: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
3ed0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
3ee0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3ef0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3f00: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3f10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
3f20: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3f30: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3f40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
3f50: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3f60: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
3f70: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
3f80: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
3f90: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3fa0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
3fb0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3fc0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
3fd0: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
3fe0: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
3ff0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4000: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
4010: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
4020: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4040: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4050: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4060: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4070: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
4080: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4090: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
40a0: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
40b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
40c0: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
40d0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
40e0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
40f0: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
4100: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
4110: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
4120: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4130: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
4140: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
4150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4160: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
4170: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
4180: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4190: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
41a0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
41b0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
41c0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
41d0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
41e0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
41f0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
4200: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
4210: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
4220: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4230: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4240: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
4250: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
4260: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4270: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4280: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4290: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
42a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
42b0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
42c0: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
42d0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
42e0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
42f0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
4300: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
4310: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
4320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
4330: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
4340: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
4350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4360: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4370: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4380: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4390: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
43a0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
43b0: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
43c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
43d0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
43e0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
43f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
4400: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
4410: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
4420: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
4430: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4440: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
4450: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
4460: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4470: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4480: 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e  * Invoke open().
4490: 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65    Do so multiple
44a0: 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74   times, until it
44b0: 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64 73   either succeeds
44c0: 20 6f 72 0a 2a 2a 20 66 69 6c 65 73 20 66 6f 72   or.** files for
44d0: 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68   some reason oth
44e0: 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a  er than EINTR..*
44f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
4500: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22   creation mode "
4510: 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65 74  m" is 0 then set
4520: 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75   it to the defau
4530: 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65  lt for.** SQLite
4540: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
4550: 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  s SQLITE_DEFAULT
4560: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
4570: 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30  S (normally.** 0
4580: 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64  644) as modified
4590: 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20 75   by the system u
45a0: 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e  mask.  If m is n
45b0: 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61  ot 0, then.** ma
45c0: 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65 61  ke the file crea
45d0: 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61  tion mode be exa
45e0: 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20  ctly m ignoring 
45f0: 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  the umask..**.**
4600: 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72   The m parameter
4610: 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72   will be non-zer
4620: 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61  o only when crea
4630: 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72  ting -wal, -jour
4640: 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d  nal,.** and -shm
4650: 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74   files.  We want
4660: 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20   those files to 
4670: 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74  have *exactly* t
4680: 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69  he same.** permi
4690: 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20  ssions as their 
46a0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
46b0: 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64  e, unadulterated
46c0: 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
46d0: 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69  * In that way, i
46e0: 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
46f0: 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f  e is -rw-rw-rw o
4700: 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64  r -rw-rw-r-, and
4710: 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f   a.** transactio
4720: 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65  n crashes and le
4730: 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20  aves behind hot 
4740: 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61  journals, then a
4750: 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68  ny.** process th
4760: 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72  at is able to wr
4770: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
4780: 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65  ase will also be
4790: 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f   able to.** reco
47a0: 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ver the hot jour
47b0: 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nals..*/.static 
47c0: 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  int robust_open(
47d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
47e0: 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b  nt f, mode_t m){
47f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 6f 64  .  int rc;.  mod
4800: 65 5f 74 20 6d 32 3b 0a 20 20 6d 6f 64 65 5f 74  e_t m2;.  mode_t
4810: 20 6f 72 69 67 4d 20 3d 20 30 3b 0a 20 20 69 66   origM = 0;.  if
4820: 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 32  ( m==0 ){.    m2
4830: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
4840: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
4850: 4e 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NS;.  }else{.   
4860: 20 6d 32 20 3d 20 6d 3b 0a 20 20 20 20 6f 72 69   m2 = m;.    ori
4870: 67 4d 20 3d 20 6f 73 55 6d 61 73 6b 28 30 29 3b  gM = osUmask(0);
4880: 0a 20 20 7d 0a 20 20 64 6f 7b 20 72 63 20 3d 20  .  }.  do{ rc = 
4890: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 20  osOpen(z,f,m2); 
48a0: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
48b0: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
48c0: 20 20 69 66 28 20 6d 20 29 7b 0a 20 20 20 20 6f    if( m ){.    o
48d0: 73 55 6d 61 73 6b 28 6f 72 69 67 4d 29 3b 0a 20  sUmask(origM);. 
48e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
48f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
4900: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
4910: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
4920: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
4930: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
4940: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
4950: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
4960: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
4970: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
4980: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
4990: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
49a0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
49b0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
49c0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
49d0: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
49e0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
49f0: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
4a00: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
4a10: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
4a20: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
4a30: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
4a40: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
4a50: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
4a60: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
4a70: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
4a80: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
4a90: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
4aa0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
4ab0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
4ac0: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
4ad0: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
4ae0: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
4af0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4b00: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
4b10: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
4b20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
4b30: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
4b40: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
4b50: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
4b60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
4b70: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4b80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4b90: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4ba0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
4bb0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
4bc0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
4bd0: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
4be0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4bf0: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
4c00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
4c10: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
4c20: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
4c30: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4c40: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
4c50: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
4c60: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
4c70: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
4c80: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
4c90: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
4ca0: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
4cb0: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
4cc0: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
4cd0: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
4ce0: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
4cf0: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
4d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4d10: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
4d20: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
4d30: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
4d40: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
4d50: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
4d60: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
4d70: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
4d80: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
4d90: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
4da0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
4db0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
4dc0: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
4dd0: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
4de0: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
4df0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
4e00: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
4e10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
4e20: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
4e30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4e40: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
4e50: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
4e60: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
4e70: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
4e80: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
4e90: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4ea0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
4eb0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
4ec0: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
4ed0: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
4ee0: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
4ef0: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
4f00: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
4f10: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
4f20: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
4f30: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
4f40: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
4f50: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
4f60: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
4f70: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
4f80: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
4f90: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
4fa0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
4fb0: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
4fc0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
4fd0: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
4fe0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
4ff0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5000: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5010: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
5020: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
5030: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5040: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
5050: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5060: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
5070: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
5080: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
5090: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
50a0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
50b0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
50c0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
50d0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
50e0: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
50f0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5100: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5110: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
5120: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5130: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
5140: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
5150: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
5160: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
5170: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
5180: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5190: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
51a0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
51b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
51c0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
51d0: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
51e0: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
51f0: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
5200: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
5210: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
5220: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
5230: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
5240: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
5250: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
5260: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
5270: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
5280: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
5290: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
52a0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
52b0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
52c0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
52d0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
52e0: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
52f0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
5300: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5310: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
5320: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5330: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
5340: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5350: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5360: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5370: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
5380: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5390: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
53a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
53b0: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
53c0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
53d0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
53e0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
53f0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
5400: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
5410: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
5420: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
5430: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
5440: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
5450: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
5460: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
5470: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
5480: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
5490: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
54a0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
54b0: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
54c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
54d0: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
54e0: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
54f0: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
5500: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
5510: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
5520: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
5530: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
5540: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5560: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
5570: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
5580: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
5590: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
55a0: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
55b0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
55c0: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
55d0: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
55e0: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
55f0: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
5600: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
5610: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
5620: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
5630: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
5640: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
5650: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5660: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
5670: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
5680: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
5690: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
56a0: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
56b0: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
56c0: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
56d0: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
56e0: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
56f0: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
5700: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
5710: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
5720: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
5730: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
5740: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
5750: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
5760: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
5770: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
5780: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
5790: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
57a0: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
57b0: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
57c0: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
57d0: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
57e0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
57f0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
5800: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
5810: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
5820: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
5830: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
5840: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
5850: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
5860: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
5870: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
5880: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
5890: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
58a0: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
58b0: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
58c0: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
58d0: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
58e0: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
58f0: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
5900: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
5910: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
5920: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
5930: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
5940: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
5950: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
5960: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
5970: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
5980: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
5990: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
59a0: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
59b0: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
59c0: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
59d0: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
59e0: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
59f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
5a00: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
5a10: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
5a20: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
5a30: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
5a40: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
5a50: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
5a60: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
5a70: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
5a80: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
5a90: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
5aa0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
5ab0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
5ac0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
5ad0: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
5ae0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5af0: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
5b00: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
5b10: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
5b20: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
5b30: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
5b40: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
5b50: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
5b60: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
5b70: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
5b80: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
5b90: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
5ba0: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
5bb0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
5bc0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
5bd0: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
5be0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5bf0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
5c00: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
5c10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5c20: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
5c30: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
5c40: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
5c50: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
5c60: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
5c70: 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69   .  /* EDEADLK i
5c80: 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
5c90: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e  if a call to fcn
5ca0: 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20  tl(F_SETLKW) is 
5cb0: 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74  made. And.  ** t
5cc0: 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  his module never
5cd0: 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61   makes such a ca
5ce0: 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65  ll. And the code
5cf0: 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c   in SQLite itsel
5d00: 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20  f .  ** asserts 
5d10: 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  that SQLITE_IOER
5d20: 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76  R_BLOCKED is nev
5d30: 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72  er returned. For
5d40: 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20   these reasons. 
5d50: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73   ** this case is
5d60: 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
5d70: 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74  out. If the syst
5d80: 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e  em does set errn
5d90: 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20  o to EDEADLK,.  
5da0: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53  ** the default S
5db0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
5dc0: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74  code will be ret
5dd0: 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a  urned. */.#if 0.
5de0: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
5df0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5e00: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
5e10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
5e20: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
5e30: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
5e40: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
5e50: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
5e60: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
5e70: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
5e80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
5e90: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
5ea0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
5eb0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
5ec0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
5ed0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
5ee0: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
5ef0: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
5f00: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
5f10: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5f20: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
5f30: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
5f40: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
5f50: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
5f60: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
5f70: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
5f80: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
5f90: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
5fa0: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
5fb0: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
5fc0: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
5fd0: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
5fe0: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6000: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
6010: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
6020: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
6030: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
6040: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
6050: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
6060: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
6070: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
6080: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
6090: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
60a0: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
60b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
60c0: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
60d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6130: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
6140: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6150: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6170: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
6180: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
6190: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
61a0: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
61b0: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
61c0: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
61d0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
61e0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
61f0: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
6200: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
6210: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
6220: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
6230: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
6240: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6250: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
6260: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6270: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6280: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6290: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
62a0: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
62b0: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
62c0: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
62d0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
62e0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
62f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
6300: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
6310: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
6320: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6330: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
6340: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
6350: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
6360: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
6370: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
6380: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
6390: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
63a0: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
63b0: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
63c0: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
63d0: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
63e0: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
63f0: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
6400: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
6410: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
6420: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6430: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
6440: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
6450: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6460: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
6470: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
6480: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
6490: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
64b0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
64c0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
64d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6500: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
6510: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
6520: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
6530: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
6540: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
6550: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
6560: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
6570: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
6580: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
6590: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
65a0: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
65b0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
65c0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
65d0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
65e0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
65f0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
6600: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
6610: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
6620: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
6630: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
6640: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
6650: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
6660: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
6670: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
6680: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
6690: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
66a0: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
66b0: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
66c0: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
66d0: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
66e0: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
66f0: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
6700: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
6710: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6720: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
6730: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
6740: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6750: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
6760: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
6770: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
6780: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
6790: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
67a0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
67b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
67c0: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
67d0: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
67e0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
67f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6800: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6810: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6820: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6830: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6840: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
6850: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
6860: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
6870: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6890: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
68a0: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
68b0: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
68c0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
68d0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
68e0: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
68f0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6900: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6910: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6920: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6940: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
6950: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
6960: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
6970: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
6980: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
6990: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
69a0: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
69b0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
69c0: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
69d0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
69e0: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
69f0: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
6a00: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
6a10: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
6a20: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
6a30: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
6a40: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
6a50: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
6a60: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
6a70: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6a80: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
6a90: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
6aa0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
6ab0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6ac0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
6ad0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6ae0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
6af0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6b00: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6b10: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
6b20: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
6b30: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
6b40: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
6b50: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
6b60: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
6b70: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
6b80: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
6b90: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6ba0: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
6bb0: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
6bc0: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
6bd0: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
6be0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
6c10: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
6c20: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
6c30: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
6c40: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
6c50: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
6c60: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
6c70: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
6c80: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
6c90: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
6ca0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
6cb0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
6cc0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
6cd0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
6ce0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
6cf0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
6d00: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
6d10: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
6d20: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
6d30: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
6d40: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
6d50: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
6d60: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
6d70: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
6d80: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
6d90: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
6da0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
6db0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
6dc0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6dd0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
6de0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
6df0: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
6e00: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
6e10: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
6e20: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
6e30: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
6e40: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
6e50: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
6e60: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
6e70: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
6e80: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
6e90: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
6ea0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6eb0: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
6ec0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
6ed0: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
6ee0: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
6ef0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
6f00: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
6f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
6f20: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
6f30: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
6f40: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
6f50: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
6f60: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
6f70: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
6f80: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
6f90: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
6fa0: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
6fb0: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
6fc0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
6fd0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
6fe0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
7000: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7010: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
7020: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7030: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
7040: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
7050: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
7060: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
7070: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
7080: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
7090: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
70a0: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
70b0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
70c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
70d0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
70e0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
70f0: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
7100: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
7110: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
7120: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
7130: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
7140: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
7150: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
7160: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
7170: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
7180: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
7190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
71a0: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
71b0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
71c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
71d0: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
71e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
71f0: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
7200: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
7210: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
7220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
7230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
7280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
72f0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
7320: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
7330: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
7340: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
7350: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
7360: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
7370: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
7380: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
7390: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
73a0: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
73b0: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
73c0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
73d0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
73e0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
73f0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
7400: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
7410: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
7420: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
7430: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
7440: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
7450: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
7460: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
7470: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
7480: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
7490: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
74a0: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
74b0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
74c0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
74d0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
74e0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
74f0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
7500: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
7510: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
7520: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
7530: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
7540: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
7550: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
7560: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
7570: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
7580: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
7590: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
75a0: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
75b0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
75c0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
75d0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
75e0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
75f0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
7600: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
7610: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
7620: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
7630: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
7640: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
7650: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
7660: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
7670: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
7680: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
7690: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
76a0: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
76b0: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
76c0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
76d0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
76e0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
76f0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
7700: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
7710: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
7720: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
7730: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
7740: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
7750: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
7760: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
7770: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
7780: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
7790: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
77a0: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
77b0: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
77c0: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
77d0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
77e0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
77f0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
7800: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
7810: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
7820: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
7830: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
7840: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
7850: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
7860: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
7870: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
7880: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
7890: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
78a0: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
78b0: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
78c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
78d0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
78e0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
78f0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
7900: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
7910: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
7920: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
7930: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
7940: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
7950: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
7960: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
7970: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
7980: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
7990: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
79a0: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
79b0: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
79c0: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
79d0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
79e0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
79f0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
7a00: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
7a10: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
7a20: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
7a30: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
7a40: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
7a50: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
7a60: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
7a70: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
7a80: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
7a90: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
7aa0: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
7ab0: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
7ac0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
7ad0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
7ae0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
7af0: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
7b00: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
7b10: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
7b20: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
7b30: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
7b40: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
7b50: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
7b60: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
7b70: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
7b80: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
7b90: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
7ba0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
7bb0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
7bc0: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
7bd0: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
7be0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7bf0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
7c00: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
7c10: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
7c20: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
7c30: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
7c40: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
7c50: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
7c60: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
7c70: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
7c80: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
7c90: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
7ca0: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
7cb0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
7cc0: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
7cd0: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
7ce0: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
7cf0: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
7d00: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
7d10: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
7d20: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
7d30: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
7d40: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
7d50: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
7d60: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
7d70: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
7d80: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
7d90: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
7da0: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
7db0: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
7dc0: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
7dd0: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
7de0: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
7df0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
7e00: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
7e10: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
7e20: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
7e30: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
7e40: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
7e50: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
7e60: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
7e70: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
7e80: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
7e90: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
7ea0: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
7eb0: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
7ec0: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
7ed0: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
7ee0: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
7ef0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
7f00: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
7f10: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
7f20: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
7f30: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
7f40: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
7f50: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
7f60: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
7f70: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
7f80: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
7f90: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
7fa0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
7fb0: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
7fc0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
7fd0: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
7fe0: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
7ff0: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
8000: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
8010: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
8020: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
8030: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
8040: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
8050: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
8060: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
8070: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
8080: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
8090: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
80a0: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
80b0: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
80c0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
80d0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
80e0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
80f0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
8100: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
8110: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
8120: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
8130: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
8140: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
8150: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
8160: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
8170: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
8180: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
8190: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
81a0: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
81b0: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
81c0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
81d0: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
81e0: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
81f0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
8200: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
8210: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
8220: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
8230: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
8240: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
8250: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
8260: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
8270: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
8280: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
8290: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
82a0: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
82b0: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
82c0: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
82d0: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
82e0: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
82f0: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
8300: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
8310: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
8320: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
8330: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
8340: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
8350: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
8360: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
8370: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
8380: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
8390: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
83a0: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
83b0: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
83c0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
83d0: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
83e0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
83f0: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
8400: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
8410: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
8420: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
8430: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
8440: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
8450: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
8460: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
8470: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
8480: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
8490: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
84a0: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
84b0: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
84c0: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
84d0: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
84e0: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
84f0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
8500: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
8510: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
8520: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
8530: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
8540: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
8550: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
8560: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
8570: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
8580: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8590: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
85a0: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
85b0: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
85c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
85d0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
85e0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
85f0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
8600: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
8610: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
8620: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
8630: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8640: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
8670: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
8680: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
8690: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
86a0: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
86b0: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
86c0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74  */.#else.  ino_t
86d0: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
86e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
86f0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
8700: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
8710: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
8720: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
8730: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
8740: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
8750: 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c  inode.  Or, on L
8760: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65  inuxThreads, the
8770: 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  re is one of the
8780: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  se structures fo
8790: 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20  r.** each inode 
87a0: 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74  opened by each t
87b0: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  hread..**.** A s
87c0: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
87d0: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
87e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
87f0: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
8800: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
8810: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
8820: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
8830: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
8840: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
8850: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
8860: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
8870: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
8880: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
8890: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
88a0: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
88b0: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
88c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
88d0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
88e0: 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   nShared;       
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8900: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
8910: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
8920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
8930: 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  FileLock;       
8940: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
8950: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
8960: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
8970: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50  unsigned char bP
8980: 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20  rocessLock;     
8990: 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20  /* An exclusive 
89a0: 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20  process lock is 
89b0: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  held */.  int nR
89c0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
89d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
89e0: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
89f0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
8a00: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  e */.  unixShmNo
8a10: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
8a20: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
8a30: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
8a40: 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f  ed with this ino
8a50: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63  de */.  int nLoc
8a60: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
8a70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8a80: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
8a90: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20   file locks */. 
8aa0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
8ab0: 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20  Unused;         
8ac0: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
8ad0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
8ae0: 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  lose */.  unixIn
8af0: 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20  odeInfo *pNext; 
8b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
8b10: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  t of all unixIno
8b20: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
8b30: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
8b40: 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  o *pPrev;       
8b50: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
8b60: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
8b70: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
8b80: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
8b90: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
8ba0: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
8bb0: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
8bc0: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
8bd0: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
8be0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
8bf0: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c10: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
8c20: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
8c30: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
8c40: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
8c50: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
8c60: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
8c70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
8c80: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
8c90: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
8ca0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
8cb0: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
8cc0: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a  st = 0;../*.**.*
8cd0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8ce0: 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78  - unixLogError_x
8cf0: 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  (), is only ever
8d00: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
8d10: 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67  macro.** unixLog
8d20: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Error()..**.** I
8d30: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
8d40: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
8d50: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
8d60: 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68  tion and errno h
8d70: 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20  as been.** set. 
8d80: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
8d90: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
8da0: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
8db0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8dc0: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61  ue of.** errno a
8dd0: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
8de0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8df0: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
8e00: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
8e10: 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  r.** strerror_r(
8e20: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  )..**.** The fir
8e30: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
8e40: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
8e50: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
8e60: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
8e70: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
8e80: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
8e90: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
8ea0: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
8eb0: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
8ec0: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
8ed0: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
8ee0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
8ef0: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
8f00: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28  that.** failed (
8f10: 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22  e.g. "unlink", "
8f20: 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74  open") and the t
8f30: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
8f40: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
8f50: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
8f60: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
8f70: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
8f80: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
8f90: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
8fa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8fb0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
8fc0: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
8ff0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
9000: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
9010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9020: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
9030: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
9040: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9050: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
9060: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
9070: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9080: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
9090: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
90b0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
90c0: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
90d0: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
90e0: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9100: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
9110: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
9120: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
9130: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9150: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
9160: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
9170: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
9180: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
9190: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
91a0: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
91b0: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
91c0: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
91d0: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
91e0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
91f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
9200: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
9210: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
9220: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
9230: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
9240: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9250: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
9260: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
9270: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
9280: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
9290: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
92a0: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
92b0: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
92c0: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
92d0: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
92e0: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
92f0: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
9300: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
9310: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
9320: 73 20 74 68 65 20 74 68 65 20 47 4e 55 20 76 65  s the the GNU ve
9330: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
9340: 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a  r_r() that .  **
9350: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
9360: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
9370: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
9380: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
9390: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
93a0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
93b0: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
93c0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
93d0: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
93e0: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
93f0: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
9400: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
9410: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
9420: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
9430: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
9440: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
9450: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
9460: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
9470: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
9480: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
9490: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
94a0: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
94b0: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
94c0: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
94d0: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
94e0: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
94f0: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
9500: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
9510: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
9520: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
9530: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
9540: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
9550: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
9560: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
9570: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
9580: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
9590: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
95a0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
95b0: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
95c0: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
95d0: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
95e0: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
95f0: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
9600: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
9610: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
9620: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
9630: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
9640: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
9650: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
9660: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
9670: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9680: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
9690: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
96a0: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
96b0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
96c0: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
96d0: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
96e0: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
96f0: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
9700: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
9710: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
9720: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
9730: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
9740: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
9750: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
9760: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
9770: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
9780: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
9790: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
97a0: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
97b0: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
97c0: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
97d0: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
97e0: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
97f0: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
9800: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
9810: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
9820: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
9830: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
9840: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
9850: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
9860: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
9870: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
9880: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
9890: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
98a0: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
98b0: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
98c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
98d0: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
98e0: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
98f0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
9900: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
9910: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
9920: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
9930: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
9940: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
9950: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
9960: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
9970: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9980: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
9990: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
99a0: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
99b0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
99c0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
99d0: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
9a00: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
9a10: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
9a20: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
9a30: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
9a40: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
9a50: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
9a60: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
9a70: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
9a80: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
9a90: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
9aa0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9ab0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
9ac0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
9ad0: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
9ae0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
9af0: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
9b00: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
9b10: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
9b20: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
9b30: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
9b40: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
9b50: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
9b60: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
9b70: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
9b80: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
9b90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
9ba0: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
9bb0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
9bc0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
9bd0: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
9be0: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
9bf0: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
9c00: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
9c10: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
9c20: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
9c30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9c40: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
9c50: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
9c60: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
9c70: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
9c80: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
9c90: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9ca0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
9cb0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
9cc0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
9cd0: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
9ce0: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
9cf0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
9d00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
9d10: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
9d20: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
9d30: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
9d40: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
9d50: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
9d60: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
9d70: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
9d80: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
9d90: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
9da0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
9db0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
9dc0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9dd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9de0: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
9df0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
9e00: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
9e10: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
9e20: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
9e30: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
9e40: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
9e50: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
9e60: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
9e70: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
9e80: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
9e90: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
9ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9eb0: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
9ec0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9ed0: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
9ee0: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
9ef0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9f00: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
9f10: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
9f20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9f30: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
9f40: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
9f50: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
9f60: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
9f70: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
9f80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
9f90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9fa0: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9fb0: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9fc0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9fd0: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9fe0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9ff0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
a000: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
a010: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
a020: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a030: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
a040: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a050: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
a060: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
a070: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
a080: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
a090: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a0a0: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
a0b0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
a0c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a0d0: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
a0e0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
a110: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
a120: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a140: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
a150: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
a160: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
a170: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
a180: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
a190: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
a1a0: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
a1b0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
a1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
a1d0: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
a1e0: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
a1f0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
a200: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
a210: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
a220: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a230: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
a240: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
a250: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
a260: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
a270: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
a280: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
a290: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
a2a0: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
a2b0: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
a2c0: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
a2d0: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
a2e0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
a2f0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
a300: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a310: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
a320: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
a330: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
a340: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
a350: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
a360: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
a370: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a380: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
a390: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
a3a0: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
a3b0: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
a3c0: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
a3d0: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
a3e0: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
a3f0: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
a400: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
a410: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
a420: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
a430: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
a440: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
a450: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
a460: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
a470: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
a480: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
a490: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
a4a0: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
a4b0: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
a4c0: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
a4d0: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
a4e0: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
a4f0: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
a500: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
a510: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
a520: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
a530: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
a540: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
a550: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
a560: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
a570: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
a580: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
a590: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
a5a0: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
a5b0: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
a5c0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
a5d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
a5e0: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
a5f0: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
a600: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
a610: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
a620: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
a630: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
a640: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
a650: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
a660: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
a670: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
a680: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
a690: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
a6a0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a6b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
a6c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a6d0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
a6e0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
a6f0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
a700: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
a710: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a720: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a730: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a740: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
a750: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
a760: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
a770: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
a780: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
a790: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
a7a0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
a7b0: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
a7c0: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
a7d0: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
a7e0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
a7f0: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
a800: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
a810: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
a820: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
a830: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
a840: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
a850: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
a860: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a870: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
a880: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
a890: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
a8a0: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
a8b0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
a8c0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
a8d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a8e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
a8f0: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
a900: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
a910: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
a920: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
a930: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
a940: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
a950: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
a960: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
a970: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
a980: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
a990: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
a9a0: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
a9b0: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
a9c0: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
a9d0: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
a9e0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
a9f0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
aa00: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
aa10: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
aa20: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
aa30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
aa40: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
aa50: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
aa60: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
aa70: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
aa80: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
aa90: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
aaa0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
aab0: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
aac0: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
aad0: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
aae0: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
aaf0: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
ab00: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
ab10: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
ab20: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
ab30: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
ab40: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
ab50: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
ab60: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
ab70: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
ab80: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
ab90: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
aba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
abb0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
abc0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
abd0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
abe0: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
abf0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
ac00: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
ac10: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
ac20: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
ac30: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
ac40: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
ac50: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
ac60: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
ac70: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
ac80: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
ac90: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
aca0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
acb0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
acc0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
acd0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
ace0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
acf0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
ad00: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
ad10: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
ad20: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
ad30: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
ad40: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
ad50: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26  if( !reserved &&
ad60: 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d   !pFile->pInode-
ad70: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
ad80: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
ad90: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
ada0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
adb0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
adc0: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
add0: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
ade0: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
adf0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ae00: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f  WRLCK;.    if( o
ae10: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ae20: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
ae30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
ae40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
ae50: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
ae60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ae70: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ae80: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
ae90: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
aea0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
aeb0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
aec0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
aed0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
aee0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
aef0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
af00: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
af10: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
af20: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
af30: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
af40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
af50: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
af60: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
af70: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
af80: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
af90: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
afa0: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
afb0: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
afc0: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
afd0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
afe0: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
aff0: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
b000: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
b010: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
b020: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
b030: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
b040: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
b050: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
b060: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
b070: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
b080: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
b090: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
b0a0: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
b0b0: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
b0c0: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
b0d0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
b0e0: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
b0f0: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
b100: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
b110: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
b120: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
b130: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
b140: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
b150: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
b160: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b170: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
b180: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
b190: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
b1a0: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
b1b0: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
b1c0: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
b1d0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
b1e0: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
b1f0: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
b200: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
b210: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
b220: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
b230: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
b240: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
b250: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
b260: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
b270: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
b280: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
b290: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
b2a0: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
b2b0: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
b2c0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
b2d0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
b2e0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
b2f0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
b300: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
b310: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
b320: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
b330: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
b340: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
b350: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
b360: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
b370: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
b380: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
b390: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
b3a0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
b3b0: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
b3c0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
b3d0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
b3e0: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
b3f0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
b400: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
b410: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b420: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
b430: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
b440: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
b450: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b460: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
b470: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
b480: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
b490: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
b4a0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
b4b0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
b4c0: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
b4d0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
b4e0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b4f0: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
b500: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
b510: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
b520: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
b530: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
b540: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
b550: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
b560: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
b570: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
b580: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
b590: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
b5a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b5b0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
b5c0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
b5d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
b5e0: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
b5f0: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
b600: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
b610: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
b620: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
b630: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
b640: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
b650: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
b660: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
b670: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
b680: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
b690: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
b6a0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
b6b0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
b6c0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
b6d0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
b6e0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
b6f0: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
b700: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
b710: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
b720: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
b730: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
b740: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
b750: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
b760: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
b770: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
b780: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
b790: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
b7a0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
b7b0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
b7c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
b7d0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
b7e0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
b7f0: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
b800: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
b810: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
b820: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
b830: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
b840: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
b850: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
b860: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
b870: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
b880: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
b890: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
b8a0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
b8b0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
b8c0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
b8d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b8e0: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
b8f0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
b900: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
b910: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
b920: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
b930: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b940: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
b950: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
b960: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
b970: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
b980: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
b990: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
b9a0: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
b9b0: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
b9c0: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
b9d0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
b9e0: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
b9f0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
ba00: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
ba10: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
ba20: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
ba30: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
ba40: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
ba50: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
ba60: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
ba70: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
ba80: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
ba90: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
baa0: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
bab0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
bac0: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
bad0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
bae0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
baf0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
bb00: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
bb10: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
bb20: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
bb30: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
bb40: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
bb50: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
bb60: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
bb70: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
bb80: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
bb90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
bba0: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
bbb0: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
bbc0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
bbd0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
bbe0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
bbf0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
bc00: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
bc10: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
bc20: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
bc30: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
bc40: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
bc50: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
bc60: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
bc70: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
bc80: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
bc90: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
bca0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
bcb0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
bcc0: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
bcd0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
bce0: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
bcf0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
bd00: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
bd10: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
bd20: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
bd30: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
bd40: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
bd50: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
bd60: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
bd70: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
bd80: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
bd90: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
bda0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
bdb0: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
bdc0: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
bdd0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
bde0: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
bdf0: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
be00: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
be10: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
be20: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
be30: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
be40: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
be50: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
be60: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
be70: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
be80: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
be90: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
bea0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
beb0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
bec0: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
bed0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
bee0: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
bef0: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
bf00: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
bf10: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
bf20: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
bf30: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
bf40: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
bf50: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
bf60: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
bf70: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
bf80: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
bf90: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
bfa0: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
bfb0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
bfc0: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
bfd0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
bfe0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
bff0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
c000: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
c010: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
c020: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
c030: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
c040: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
c050: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
c060: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
c070: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
c080: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
c090: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
c0a0: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
c0b0: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
c0c0: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
c0d0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
c0e0: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
c0f0: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
c100: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
c110: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
c120: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
c130: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
c140: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
c150: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
c160: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
c170: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
c180: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
c190: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
c1a0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
c1b0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
c1c0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
c1d0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
c1e0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
c1f0: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
c200: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
c210: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
c220: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
c230: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
c240: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
c250: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
c260: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
c270: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
c280: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
c290: 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
c2a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
c2b0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
c2c0: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
c2d0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
c2e0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
c2f0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
c300: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
c310: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
c320: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
c330: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
c340: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
c350: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
c360: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
c370: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
c380: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
c390: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
c3a0: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
c3b0: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
c3c0: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
c3d0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
c3e0: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
c3f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c400: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
c410: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
c420: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
c430: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
c440: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
c450: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
c460: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
c470: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
c480: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
c490: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
c4a0: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
c4b0: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
c4c0: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
c4d0: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
c4e0: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
c4f0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
c500: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
c510: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
c520: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
c530: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
c540: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
c550: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
c560: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
c570: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
c580: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
c590: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
c5a0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c5b0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
c5c0: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
c5d0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
c5e0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
c5f0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
c600: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
c610: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
c620: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
c630: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
c640: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
c650: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
c660: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
c670: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
c680: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
c690: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
c6a0: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
c6b0: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
c6c0: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
c6d0: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
c6e0: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
c6f0: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
c700: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
c710: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
c720: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
c730: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
c740: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
c750: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c760: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
c770: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
c780: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
c790: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
c7a0: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
c7b0: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
c7c0: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
c7d0: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
c7e0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
c7f0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
c800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
c810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
c820: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c830: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
c840: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
c850: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c860: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c870: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
c880: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
c890: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c8a0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
c8b0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c8c0: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c8d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c8e0: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
c8f0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c900: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c910: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
c920: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
c930: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c940: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c950: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
c960: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
c970: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
c980: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
c990: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
c9a0: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
c9b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c9c0: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
c9d0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
c9e0: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
c9f0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
ca00: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
ca10: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
ca20: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
ca30: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ca40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
ca50: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
ca60: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
ca70: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
ca80: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
ca90: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
caa0: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
cab0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
cac0: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
cad0: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
cae0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
caf0: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
cb00: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
cb10: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
cb20: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
cb30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
cb40: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
cb50: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
cb60: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
cb70: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
cb80: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
cb90: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
cba0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
cbb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cbc0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
cbd0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
cbe0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
cbf0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
cc00: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
cc10: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
cc20: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
cc30: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
cc40: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
cc50: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
cc60: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
cc70: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
cc80: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
cc90: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
cca0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
ccb0: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
ccc0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
ccd0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
cce0: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
ccf0: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
cd00: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
cd10: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
cd20: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
cd30: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
cd40: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
cd50: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
cd60: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
cd70: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
cd80: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
cd90: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
cda0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
cdb0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  _LOCK);.    }.. 
cdc0: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
cdd0: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
cde0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
cdf0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
ce00: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
ce10: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
ce20: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ce30: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
ce40: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
ce50: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20  File, &lock) && 
ce60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ce70: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
ce80: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
ce90: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
cea0: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
ceb0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
cec0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
ced0: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d  R_UNLOCK; .    }
cee0: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
cef0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cf00: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
cf10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cf20: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
cf30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
cf40: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
cf50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
cf60: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
cf70: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
cf80: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
cf90: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
cfa0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
cfb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
cfc0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
cfd0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
cfe0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
cff0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
d000: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
d010: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
d020: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
d030: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
d040: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
d050: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
d060: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
d070: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d080: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
d090: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
d0a0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
d0b0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
d0c0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
d0d0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
d0e0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
d0f0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
d100: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
d110: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
d120: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
d130: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
d140: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
d150: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
d160: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
d170: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
d180: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
d190: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
d1a0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
d1b0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d1c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
d1d0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
d1e0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
d1f0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
d200: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
d210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
d220: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
d230: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
d240: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
d250: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
d260: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
d270: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
d280: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
d290: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d2a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d2b0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d2c0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d2d0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d2e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d2f0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
d300: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d310: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d320: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d330: 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    ..#ifndef NDEB
d340: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
d350: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
d360: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
d370: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
d380: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
d390: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
d3a0: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
d3b0: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
d3c0: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
d3d0: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
d3e0: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
d3f0: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
d400: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
d410: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
d420: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
d430: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
d440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
d450: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
d460: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
d470: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
d480: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
d490: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
d4a0: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
d4b0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
d4c0: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
d4d0: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
d4e0: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
d4f0: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
d500: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d510: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d520: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
d530: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
d540: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
d550: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
d560: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
d570: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
d580: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d590: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
d5a0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
d5b0: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
d5c0: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
d5d0: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
d5e0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
d5f0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d600: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
d610: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
d620: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
d630: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
d640: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
d650: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
d660: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d670: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
d680: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
d690: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
d6a0: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
d6b0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
d6c0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
d6d0: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
d6e0: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
d6f0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
d700: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
d710: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
d720: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
d730: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
d740: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
d750: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
d760: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
d770: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
d780: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
d790: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
d7a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
d7b0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
d7c0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
d7d0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
d7e0: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
d7f0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
d800: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
d810: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
d820: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
d830: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
d840: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d850: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
d860: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
d870: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
d880: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
d890: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d8a0: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
d8b0: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
d8c0: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
d8d0: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
d8e0: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
d8f0: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
d900: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
d910: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
d920: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
d930: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
d940: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
d950: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
d960: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
d970: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
d980: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
d990: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
d9a0: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
d9b0: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
d9c0: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
d9d0: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
d9e0: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
d9f0: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
da00: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
da10: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
da20: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
da30: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
da40: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
da50: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
da60: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
da70: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
da80: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
da90: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
daa0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
dab0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
dac0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
dad0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
dae0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
daf0: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
db00: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
db10: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
db20: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
db30: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
db40: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
db50: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
db60: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
db70: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
db80: 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
db90: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
dba0: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
dbb0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
dbc0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
dbd0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
dbe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
dbf0: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
dc00: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
dc10: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
dc20: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
dc30: 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
dc40: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
dc50: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
dc60: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
dc70: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
dc80: 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
dc90: 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 6e 64 65  eLock );..#ifnde
dca0: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
dcb0: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
dcc0: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
dcd0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
dce0: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
dcf0: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
dd00: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
dd10: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
dd20: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
dd30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
dd40: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
dd50: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
dd60: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
dd70: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
dd80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
dd90: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
dda0: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
ddb0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
ddc0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
ddd0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
dde0: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
ddf0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
de00: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
de10: 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
de20: 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
de30: 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
de40: 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
de50: 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
de60: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
de70: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
de80: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
de90: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
dea0: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
deb0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
dec0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
ded0: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
dee0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
def0: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
df00: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
df10: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
df20: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
df30: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
df40: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
df50: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
df60: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
df70: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
df80: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
df90: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
dfa0: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
dfb0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
dfc0: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
dfd0: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
dfe0: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
dff0: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
e000: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
e010: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
e020: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
e030: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
e040: 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69  CK ){..#if !defi
e050: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
e060: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
e070: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
e080: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
e090: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
e0a0: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
e0b0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
e0c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
e0d0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
e0e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
e0f0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
e100: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
e110: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
e120: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
e130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e140: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
e150: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
e160: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
e170: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
e180: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
e190: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
e1a0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e1b0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
e1c0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e1d0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
e1e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e1f0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
e200: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
e210: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
e220: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e230: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e240: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
e250: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e260: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e270: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e280: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
e290: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e2a0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e2b0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e2c0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
e2d0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
e2e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
e2f0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
e300: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
e310: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
e320: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
e330: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
e340: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e350: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e360: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
e370: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
e380: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
e390: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e3a0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e3b0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
e3c0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
e3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
e3e0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
e3f0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
e400: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
e410: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
e420: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e430: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e440: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e450: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
e460: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
e470: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
e480: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
e490: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
e4a0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e4b0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
e4c0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
e4d0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e4e0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e4f0: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
e500: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e510: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
e520: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
e530: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e540: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e550: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
e560: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
e570: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e580: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e590: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
e5a0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
e5b0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
e5c0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
e5d0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
e5e0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
e5f0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e600: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e610: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e620: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
e630: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
e640: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
e650: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
e660: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
e670: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e680: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
e690: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e6a0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
e6b0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e6c0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
e6d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e6e0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
e6f0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
e700: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e710: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
e720: 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
e730: 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  , the call to un
e740: 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e  ixFileLock() can
e750: 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65  not fail because
e760: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20   another.       
e770: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73     ** process is
e780: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f   holding an inco
e790: 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49  mpatible lock. I
e7a0: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20  f it does, this 
e7b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
e7c0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
e7d0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
e7e0: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  s not following 
e7f0: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20  the locking.    
e800: 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f        ** protoco
e810: 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  l. If this happe
e820: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
e830: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20  E_IOERR_RDLOCK. 
e840: 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  Returning.      
e850: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
e860: 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65  SY would confuse
e870: 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
e880: 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74   (in practice it
e890: 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20   causes .       
e8a0: 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20     ** an assert 
e8b0: 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20  to fail). */ .  
e8c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e8d0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
e8e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  ;.          pFil
e8f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e900: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e910: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
e920: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e930: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
e940: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
e950: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
e960: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
e970: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
e980: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
e990: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
e9a0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
e9b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
e9c0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
e9d0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
e9e0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e9f0: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
ea00: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
ea10: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
ea20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ea30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ea40: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
ea50: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ea60: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ea70: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
ea80: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
ea90: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
eaa0: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
eab0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
eac0: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
ead0: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
eae0: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
eaf0: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
eb00: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
eb10: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
eb20: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
eb30: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
eb40: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
eb50: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
eb60: 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
eb70: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
eb80: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
eb90: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
eba0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
ebb0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ebc0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
ebd0: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
ebe0: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
ebf0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ec00: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
ec10: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
ec20: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
ec30: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
ec40: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
ec50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ec60: 4c 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61  LOCK;..pFile->la
ec70: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
ec80: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
ec90: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
eca0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
ecb0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
ecc0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
ecd0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ece0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
ecf0: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
ed00: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
ed10: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
ed20: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
ed30: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
ed40: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
ed50: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
ed60: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
ed70: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
ed80: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
ed90: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
eda0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
edb0: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
edc0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
edd0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
ede0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
edf0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
ee00: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
ee10: 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75     }.  }...end_u
ee20: 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  nlock:.  unixLea
ee30: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
ee40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ee50: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ee60: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
ee70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ee80: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
ee90: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
eea0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
eeb0: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
eec0: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
eed0: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
eee0: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
eef0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
ef00: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
ef10: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
ef20: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
ef30: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
ef40: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
ef50: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
ef60: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
ef70: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
ef80: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
ef90: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
efa0: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
efb0: 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
efc0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
efd0: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
efe0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
eff0: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
f000: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
f010: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
f020: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
f030: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
f040: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
f050: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
f060: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
f070: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
f080: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
f090: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
f0a0: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
f0b0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
f0c0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
f0d0: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
f0e0: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
f0f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
f100: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
f110: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
f120: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
f130: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
f140: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
f150: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
f160: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
f170: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
f180: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
f190: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
f1a0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
f1b0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
f1c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
f1d0: 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f  0 ){.    robust_
f1e0: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
f1f0: 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
f200: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ;.    pFile->h =
f210: 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f   -1;.  }.#if OS_
f220: 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
f230: 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
f240: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
f250: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
f260: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
f270: 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
f280: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
f290: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
f2a0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
f2b0: 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
f2c0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64  ;.    pFile->pId
f2d0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
f2e0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
f2f0: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
f300: 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
f310: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
f320: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
f330: 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d  e->pUnused);.  m
f340: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
f350: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
f360: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
f370: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f380: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
f390: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
f3a0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
f3b0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
f3c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f3d0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
f3e0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
f3f0: 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  d;.  unixUnlock(
f400: 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
f410: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
f420: 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
f430: 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
f440: 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
f450: 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
f460: 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
f470: 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
f480: 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
f490: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
f4a0: 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
f4b0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
f4c0: 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
f4d0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
f4e0: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
f4f0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
f500: 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
f510: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
f520: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
f530: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
f540: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
f550: 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
f560: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
f570: 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
f580: 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
f590: 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
f5a0: 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
f5b0: 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
f5c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
f5d0: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
f5e0: 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
f5f0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
f600: 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
f610: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
f620: 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
f630: 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
f640: 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
f650: 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
f660: 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
f670: 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
f680: 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
f690: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
f6a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
f6c0: 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
f6d0: 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
f6e0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
f7c0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
f7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f7f0: 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
f800: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
f810: 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
f820: 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
f830: 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
f840: 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
f850: 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
f860: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
f870: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
f880: 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
f890: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
f8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
f8b0: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
f8c0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
f8d0: 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
f8e0: 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
f8f0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
f900: 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
f910: 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
f920: 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
f930: 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
f940: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
f950: 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
f960: 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
f970: 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
f980: 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
f990: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
f9a0: 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
f9b0: 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
f9c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
f9d0: 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
f9e0: 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
f9f0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
fa00: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
fa10: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
fa20: 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
fa30: 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
fa40: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
fa50: 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
fa60: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
fa70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
fa80: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
fa90: 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
faa0: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
fab0: 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
fac0: 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
fad0: 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
fae0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
faf0: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
fb00: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
fb10: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
fb20: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
fb30: 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
fb40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fb50: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
fb60: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
fb70: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
fb80: 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
fb90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fba0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
fbb0: 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
fbc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
fbd0: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
fbe0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
fbf0: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
fc00: 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
fc10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
fc20: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
fc30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fc40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fc50: 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
fc60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
fc70: 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
fc80: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
fc90: 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
fca0: 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
fcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcc0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
fcd0: 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
fce0: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
fcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
fd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
fd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
fda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdb0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
fdc0: 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
fdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
fdf0: 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
fe00: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
fe10: 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
fe20: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70  existance of sep
fe30: 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
fe40: 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69  les (really a di
fe50: 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74  rectory) to cont
fe60: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
fe70: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
fe80: 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75  s works.** on ju
fe90: 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  st about every f
fea0: 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
feb0: 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
fec0: 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
fed0: 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
fee0: 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
fef0: 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
ff00: 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
ff10: 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
ff20: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
ff30: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
ff40: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
ff50: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
ff60: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
ff70: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
ff80: 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
ff90: 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
ffa0: 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
ffb0: 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
ffc0: 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
ffd0: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
ffe0: 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
fff0: 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
10000 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
10010 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
10020 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
10030 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
10040 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
10050 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
10060 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
10070 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
10080 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72  ng a subdirector
10090 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  y in the same di
100a0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
100b0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  e database and w
100c0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
100d0 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
100e0 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
100f0 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
10100 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stance of a lock
10110 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69   directory impli
10120 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
10130 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
10140 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28  .** lock types (
10150 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
10160 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
10170 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
10180 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
10190 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
101a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
101b0 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
101c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
101d0 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64  te the.** lock d
101e0 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65  irectory..*/.#de
101f0 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
10200 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
10210 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10220 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
10230 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
10240 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
10250 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
10260 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
10270 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
10280 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
10290 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
102a0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
102b0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
102c0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
102d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
102e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
102f0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
10300 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
10310 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
10320 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
10330 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
10340 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10350 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
10360 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
10370 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
10380 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
10390 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
103a0 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
103b0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
103c0 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
103d0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
103e0 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
103f0 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
10400 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
10410 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
10420 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
10430 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10440 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
10450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10460 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
10470 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
10480 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10490 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
104a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
104b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
104c0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
104d0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
104e0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
104f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
10500 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
10510 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
10520 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
10530 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
10540 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
10550 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
10560 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
10570 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
10580 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
10590 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
105a0 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
105b0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
105c0 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
105d0 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
105e0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
105f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
10600 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
10610 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
10620 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
10630 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
10640 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
10650 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
10660 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10670 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
10680 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
10690 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
106a0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
106b0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
106c0 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
106d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
106e0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
106f0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
10700 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
10710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
10720 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
10730 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
10740 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
10750 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
10760 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10770 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
10780 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
10790 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
107a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
107b0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
107c0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
107d0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
107e0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
107f0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
10800 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
10810 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
10820 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
10830 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
10840 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
10850 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
10860 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
10870 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
10880 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
10890 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
108a0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
108b0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
108c0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
108d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
108e0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
108f0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
10900 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
10910 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
10920 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
10930 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
10940 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
10950 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
10960 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
10970 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10980 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
10990 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
109a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
109b0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
109c0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
109d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
109e0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
109f0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
10a00 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
10a10 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
10a20 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
10a30 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
10a40 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10a50 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
10a60 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
10a70 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
10a80 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
10a90 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
10aa0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
10ab0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
10ac0 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
10ad0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10ae0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
10af0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10b00 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10b10 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
10b20 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
10b30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
10b40 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
10b50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
10b60 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
10b70 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
10b80 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
10b90 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
10ba0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
10bb0 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
10bc0 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
10bd0 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
10be0 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
10bf0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10c00 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
10c10 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10c20 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
10c30 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
10c40 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
10c50 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
10c60 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
10c70 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
10c80 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
10c90 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
10ca0 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
10cb0 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
10cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10cd0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
10ce0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
10cf0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
10d00 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
10d10 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
10d20 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
10d30 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
10d40 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
10d50 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
10d60 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10d70 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
10d80 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
10d90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10da0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
10db0 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
10dc0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10dd0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10de0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
10df0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
10e00 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10e10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
10e20 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10e30 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
10e40 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10e50 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
10e60 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
10e70 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
10e80 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
10e90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
10ea0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
10eb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10ec0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10ed0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10ee0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10ef0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10f00 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
10f10 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
10f20 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
10f30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
10f40 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
10f50 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
10f60 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
10f70 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
10f80 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10f90 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
10fa0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10fb0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
10fc0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10fd0 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
10fe0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
10ff0 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
11000 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
11010 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11020 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
11030 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
11040 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
11050 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
11060 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
11070 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
11080 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
11090 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
110a0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
110b0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
110c0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
110d0 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
110e0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
110f0 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
11100 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
11110 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
11120 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
11130 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
11140 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
11150 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
11160 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
11170 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
11180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11190 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
111a0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
111b0 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
111c0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
111d0 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
111e0 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
111f0 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
11200 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
11210 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
11220 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
11230 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11240 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11250 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
11260 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11270 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11280 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
11290 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
112a0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
112b0 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
112c0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
112d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
112e0 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
112f0 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
11300 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
11310 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
11320 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
11330 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
11340 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11350 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
11360 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
11370 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
11380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
11390 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
113a0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
113b0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
113c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
113d0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
113e0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
113f0 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
11400 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
11410 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
11420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11430 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
11440 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
11450 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
11460 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
11470 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
11480 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
11490 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
114a0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
114b0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
114c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
114d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
114e0 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
114f0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
11500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
11510 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
11520 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
11530 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
11540 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
11550 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
11560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
11570 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
11580 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
11590 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
115a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
115b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115f0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11640 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
11670 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
11680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11690 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
116a0 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
116b0 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
116c0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
116d0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
116e0 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
116f0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
11700 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
11710 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
11720 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
11730 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
11740 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
11750 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
11760 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
11770 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
11780 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
11790 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
117a0 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
117b0 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
117c0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
117d0 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
117e0 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
117f0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
11800 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
11810 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
11820 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
11830 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
11840 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
11850 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
11860 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
11870 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
11880 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11890 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
118a0 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
118b0 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
118c0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
118d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
118e0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
118f0 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  RKS../*.** Retry
11900 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
11910 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
11920 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
11930 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
11940 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
11950 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
11960 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
11970 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
11980 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
11990 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
119a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
119b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
119c0 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
119d0 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
119e0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
119f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
11a00 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
11a10 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
11a20 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
11a30 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
11a40 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
11a50 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
11a60 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
11a70 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
11a80 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
11a90 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
11aa0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
11ab0 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
11ac0 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
11ad0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
11ae0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
11af0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
11b00 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
11b10 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
11b20 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
11b30 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
11b40 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
11b50 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
11b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11b70 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11b80 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11b90 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11ba0 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
11bb0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
11bc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11bd0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
11be0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
11bf0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
11c00 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
11c10 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
11c20 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
11c30 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
11c40 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
11c50 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
11c60 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
11c70 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
11c80 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
11c90 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
11ca0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
11cb0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
11cc0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
11cd0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
11ce0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
11cf0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11d00 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11d10 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
11d20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
11d30 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
11d40 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
11d50 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
11d60 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
11d70 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
11d80 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
11d90 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
11da0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11db0 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
11dc0 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
11dd0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
11de0 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
11df0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
11e00 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11e10 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
11e20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11e30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11e40 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
11e50 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20   = lrc;.        
11e60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  }.      }.    } 
11e70 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
11e80 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11e90 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
11ea0 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
11eb0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
11ec0 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
11ed0 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
11ee0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11ef0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11f00 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11f10 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
11f20 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11f30 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
11f40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11f50 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
11f60 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11f80 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
11f90 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
11fa0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
11fb0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
11fc0 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53  ved));..#ifdef S
11fd0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
11fe0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
11ff0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
12000 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
12010 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
12020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12030 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
12040 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12050 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12060 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
12070 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
12080 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12090 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
120a0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
120b0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
120c0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
120d0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
120e0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
120f0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
12100 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
12110 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
12120 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
12130 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
12140 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
12150 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
12160 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
12170 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
12180 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
12190 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
121a0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
121b0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
121c0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
121d0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
121e0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
121f0 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
12200 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
12210 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
12220 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
12230 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
12240 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
12250 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
12260 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
12270 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
12280 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
12290 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
122a0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
122b0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
122c0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
122d0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
122e0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
122f0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12300 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
12310 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
12320 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12330 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
12340 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
12350 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65   flock() only re
12360 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
12370 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
12380 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
12390 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
123a0 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
123b0 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
123c0 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
123d0 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
123e0 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
123f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
12400 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
12410 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
12420 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
12430 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
12440 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
12450 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
12460 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
12470 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
12480 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
12490 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
124a0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
124b0 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
124c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
124d0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
124e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
124f0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
12500 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12510 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
12520 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
12530 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
12540 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
12550 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
12560 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
12570 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
12580 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
12590 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
125a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
125b0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
125c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
125d0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
125e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
125f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
12600 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
12610 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72  ck */.  .  if (r
12620 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
12630 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
12640 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
12650 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12660 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
12670 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
12680 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
12690 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
126a0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
126b0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
126c0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
126d0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
126e0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
126f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12700 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  no;.    }.  } el
12710 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
12720 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
12730 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
12740 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  /.    pFile->eFi
12750 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
12760 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  ck;.  }.  OSTRAC
12770 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
12780 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  s %s (flock)\n",
12790 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
127a0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
127b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  , .           rc
127c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
127d0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
127e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
127f0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12800 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
12810 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
12820 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
12830 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
12840 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23  LITE_BUSY;.  }.#
12850 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12860 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12870 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65  K_ERRORS */.  re
12880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12890 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
128a0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
128b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
128c0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
128d0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
128e0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
128f0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
12900 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
12910 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12920 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
12930 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
12940 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
12950 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
12960 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
12970 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12990 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
129a0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
129b0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
129c0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
129d0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
129e0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
129f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
12a00 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
12a10 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12a20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e  pid=%d (flock)\n
12a30 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
12a40 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
12a50 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
12a60 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
12a70 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
12a80 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
12a90 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
12aa0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
12ab0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12ac0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
12ad0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
12ae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12af0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
12b00 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
12b10 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
12b20 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
12b30 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
12b40 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12b50 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12b60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12b70 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
12b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12b90 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
12ba0 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
12bb0 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
12bc0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
12bd0 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
12be0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
12bf0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12c00 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
12c10 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
12c20 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
12c30 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12c40 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
12c50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
12c60 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
12c70 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12c80 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12ca0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
12cb0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
12cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12cd0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
12ce0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
12cf0 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
12d00 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
12d10 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OCK);.  }.  retu
12d20 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
12d30 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
12d40 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
12d50 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
12d60 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
12d70 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
12d80 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
12d90 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
12da0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
12db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12dc0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12e10 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
12e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
12e80 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
12e90 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
12ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12eb0 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
12ec0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
12ed0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
12ee0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
12ef0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
12f00 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
12f10 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
12f20 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
12f30 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
12f40 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
12f50 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
12f60 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
12f70 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
12f80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12f90 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
12fa0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
12fb0 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
12fc0 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
12fd0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
12fe0 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
12ff0 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
13000 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
13010 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13020 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13030 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13040 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13050 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13060 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13070 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13080 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13090 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
130a0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
130b0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
130c0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
130d0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
130e0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
130f0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
13100 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
13110 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
13120 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13130 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
13140 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
13150 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
13160 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13170 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
13180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13190 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
131a0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
131b0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
131c0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
131d0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
131e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
131f0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13200 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
13210 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
13220 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
13230 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
13240 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
13250 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
13260 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
13270 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
13280 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
13290 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
132a0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
132b0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
132c0 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
132d0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
132e0 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
132f0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
13300 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63  >pSem;.    struc
13310 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
13320 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
13330 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
13340 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
13350 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13360 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
13370 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
13380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
13390 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
133a0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
133b0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
133c0 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
133d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
133e0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
133f0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
13400 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
13410 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
13420 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20   when we are in 
13430 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20  NO_LOCK */.     
13440 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70     reserved = (p
13450 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13460 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  < SHARED_LOCK);.
13470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13480 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63  e{.      /* we c
13490 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20  ould have it if 
134a0 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20  we want it */.  
134b0 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65      sem_post(pSe
134c0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
134d0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
134e0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
134f0 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
13500 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
13510 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
13520 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
13530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13540 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
13550 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
13560 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
13570 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
13580 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
13590 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
135a0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
135b0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
135c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
135d0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
135e0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
135f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
13600 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
13610 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
13620 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
13630 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
13640 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
13650 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
13660 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
13670 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
13680 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
13690 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
136a0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
136b0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
136c0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
136d0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
136e0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
136f0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
13700 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
13710 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
13720 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
13730 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
13740 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
13750 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
13760 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
13770 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
13780 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
13790 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
137a0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
137b0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
137c0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
137d0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
137e0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
137f0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13800 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
13810 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
13820 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
13830 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
13840 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
13850 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
13860 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
13870 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
13880 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
13890 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
138a0 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
138b0 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
138c0 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
138d0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
138e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
138f0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
13900 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
13910 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
13920 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
13930 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
13940 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
13950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13960 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  semLock(sqlite3_
13970 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13980 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13990 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
139a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
139b0 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20  int fd;.  sem_t 
139c0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
139d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69  Inode->pSem;.  i
139e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
139f0 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
13a00 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
13a10 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
13a20 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
13a30 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
13a40 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
13a50 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
13a60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13a70 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
13a80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13a90 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13aa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
13ab0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  K;.    goto sem_
13ac0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
13ad0 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70  .  /* lock semap
13ae0 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69  hore now but bai
13af0 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61  l out when alrea
13b00 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  dy locked. */.  
13b10 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
13b20 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
13b30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
13b40 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  Y;.    goto sem_
13b50 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
13b60 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
13b70 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
13b80 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
13b90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13ba0 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f  FileLock;.. sem_
13bb0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75  end_lock:.  retu
13bc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13bd0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13be0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13bf0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13c00 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13c10 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13c20 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13c30 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13c40 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13c50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13c60 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13c70 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
13c80 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
13c90 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
13ca0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
13cb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13cc0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13cd0 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71  int semUnlock(sq
13ce0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13cf0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13d00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13d10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13d20 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  id;.  sem_t *pSe
13d30 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
13d40 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  e->pSem;..  asse
13d50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
13d60 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
13d70 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
13d80 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
13d90 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
13da0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
13db0 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
13dc0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
13dd0 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
13de0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
13df0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
13e00 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
13e10 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
13e20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
13e30 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
13e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13e50 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13e60 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
13e70 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
13e80 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
13e90 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
13ea0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
13eb0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
13ec0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13ed0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13ee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13ef0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13f00 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
13f10 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
13f20 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
13f30 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
13f40 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
13f50 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13f60 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
13f70 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
13f80 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13f90 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
13fa0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
13fb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
13fc0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
13fd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
13fe0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
13ff0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14000 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
14010 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14020 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
14030 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
14040 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c  int semClose(sql
14050 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
14060 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
14070 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14080 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14090 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28  ;.    semUnlock(
140a0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
140b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
140c0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
140d0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
140e0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
140f0 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
14100 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
14110 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
14120 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
14140 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
14150 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
14160 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
14170 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
14180 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
14190 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
141a0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
141b0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
141c0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
141d0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
141e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
141f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14230 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
14240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14280 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142a0 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
142b0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
142c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
142e0 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
142f0 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
14300 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
14310 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
14320 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
14330 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
14340 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
14350 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
14360 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
14370 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
14380 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
14390 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
143a0 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
143b0 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
143c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
143d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
143e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
143f0 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
14400 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
14410 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
14420 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
14430 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
14440 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
14450 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14460 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14470 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
14480 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
14490 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
144a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
144b0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
144c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
144d0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
144e0 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
144f0 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
14500 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14510 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
14520 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
14530 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
14540 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
14550 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
14560 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
14570 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
14580 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
14590 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
145a0 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
145b0 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
145c0 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
145d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
145e0 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
145f0 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
14600 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
14610 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
14620 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
14630 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
14640 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
14650 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
14660 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
14690 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
146a0 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
146b0 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
146c0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
146d0 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
146e0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
146f0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
14700 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
14710 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
14720 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
14730 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
14740 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
14750 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
14760 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
14770 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
14780 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
14790 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
147a0 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
147b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
147c0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
147d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
147e0 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
147f0 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
14800 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14810 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14820 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
14830 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
14840 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
14850 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
14860 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
14870 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
14880 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
14890 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
148a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
148b0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
148c0 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
148d0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
148e0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
148f0 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
14900 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
14910 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
14920 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
14930 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
14940 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
14950 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
14960 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
14970 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
14980 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
14990 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
149a0 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
149b0 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
149c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
149d0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
149e0 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
149f0 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
14a00 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
14a10 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
14a20 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
14a30 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
14a40 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
14a50 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
14a60 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
14a70 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
14a80 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
14a90 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
14aa0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
14ab0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14ac0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
14ad0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
14ae0 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
14af0 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
14b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
14b10 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
14b20 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
14b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
14b40 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
14b50 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
14b60 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
14b70 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
14b80 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14b90 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
14bc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
14bd0 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
14be0 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
14bf0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
14c00 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
14c10 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
14c20 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
14c30 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
14c40 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
14c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14c60 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
14c70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14c80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
14c90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14ca0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
14cb0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
14cc0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
14cd0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
14ce0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
14cf0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
14d00 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
14d10 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
14d20 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
14d30 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
14d40 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
14d50 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
14d60 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
14d70 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
14d80 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
14d90 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
14da0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
14db0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
14dc0 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
14dd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
14de0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14df0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
14e00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14e10 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
14e20 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
14e30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14e40 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
14e50 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
14e60 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
14e70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
14e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14e90 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14ea0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
14eb0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14ec0 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
14ed0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
14ee0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
14ef0 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
14f00 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
14f10 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
14f20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
14f30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14f40 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
14f50 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
14f60 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
14f70 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
14f80 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
14f90 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
14fa0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
14fb0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
14fc0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
14fd0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
14fe0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
14ff0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
15000 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
15010 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
15020 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
15030 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
15040 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
15050 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
15060 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
15070 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
15080 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
15090 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
150a0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
150b0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
150c0 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
150d0 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
150e0 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
150f0 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
15100 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
15110 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
15120 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
15130 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
15140 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
15150 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15160 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15170 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
15180 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
15190 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
151a0 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
151b0 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
151c0 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
151d0 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
151e0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
151f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
15200 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15210 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
15220 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
15230 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
15240 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
15250 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
15260 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
15270 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
15280 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
15290 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
152a0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
152b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
152c0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
152d0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
152e0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
152f0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
15300 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
15310 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
15320 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
15330 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
15340 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
15350 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
15360 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
15370 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
15380 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
15390 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
153a0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
153b0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
153c0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
153d0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
153e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
153f0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
15400 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
15410 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
15420 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
15430 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
15440 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
15450 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
15460 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
15470 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
15480 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
15490 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
154a0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
154b0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
154c0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
154d0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
154e0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
154f0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
15500 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15510 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15520 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
15530 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
15540 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15550 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
15560 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
15570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15580 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
15590 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
155a0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
155b0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
155c0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
155d0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
155e0 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
155f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15600 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
15610 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15620 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
15630 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15640 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
15650 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
15660 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
15670 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
15680 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
15690 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
156a0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
156b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
156c0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
156d0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
156e0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
156f0 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
15700 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
15710 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
15720 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
15730 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
15740 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
15750 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
15760 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
15770 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
15780 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
15790 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
157a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
157b0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
157c0 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
157d0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
157e0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
157f0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
15800 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
15810 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
15820 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
15830 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
15840 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
15850 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
15860 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
15870 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
15880 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
15890 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
158a0 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
158b0 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
158c0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
158d0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
158e0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
158f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15900 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
15910 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
15920 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
15930 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
15940 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
15950 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
15960 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
15970 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
15980 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
15990 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
159a0 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
159b0 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
159c0 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
159d0 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
159e0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
159f0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
15a00 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
15a10 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
15a20 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
15a30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15a40 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
15a50 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
15a60 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
15a70 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15a80 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
15a90 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
15aa0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15ab0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
15ac0 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
15ad0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
15ae0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
15af0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
15b00 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
15b10 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
15b20 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
15b30 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
15b40 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
15b50 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
15b60 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
15b70 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
15b80 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
15b90 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
15ba0 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
15bb0 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
15bc0 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
15bd0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
15be0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
15bf0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
15c00 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
15c10 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
15c20 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
15c30 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
15c40 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15c50 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15c60 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
15c70 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
15c80 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
15c90 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
15ca0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
15cb0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
15cc0 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
15cd0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
15ce0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
15cf0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
15d00 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
15d10 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
15d20 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15d30 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
15d40 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
15d50 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15d60 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
15d70 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
15d80 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
15d90 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
15da0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15db0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
15dc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
15dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15de0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
15df0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
15e00 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
15e10 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
15e20 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
15e30 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
15e40 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
15e50 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
15e60 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
15e70 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
15e80 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
15e90 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
15ea0 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
15eb0 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
15ec0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
15ed0 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
15ee0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
15ef0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
15f00 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
15f10 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15f20 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
15f30 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
15f40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
15f50 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15f60 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
15f70 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
15f80 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
15f90 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
15fa0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15fb0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
15fc0 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
15fd0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
15fe0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
15ff0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16000 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
16010 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
16020 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16030 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16040 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16050 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16060 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16070 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16080 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16090 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
160a0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
160b0 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
160c0 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
160d0 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
160e0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
160f0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16100 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16110 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16120 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16130 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
16140 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
16150 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
16160 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
16170 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
16180 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
16190 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
161a0 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
161b0 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
161c0 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
161d0 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
161e0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
161f0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
16200 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
16210 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
16220 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
16230 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
16240 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
16250 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16260 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16270 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16280 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16290 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
162a0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
162b0 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
162c0 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
162d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
162e0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
162f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
16300 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
16310 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
16320 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16330 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16340 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
16350 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
16360 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
16370 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
16380 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
16390 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rc1Errno;.      
163a0 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
163b0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
163c0 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
163d0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
163e0 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
163f0 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
16400 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16410 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16420 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
16430 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
16440 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
16450 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
16460 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16470 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16480 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16490 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
164a0 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
164b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
164c0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
164d0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
164e0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
164f0 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
16500 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
16510 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
16520 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
16530 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
16540 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
16550 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
16560 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
16570 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16580 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
16590 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
165a0 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
165b0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
165c0 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
165d0 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
165e0 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
165f0 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
16600 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
16610 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
16620 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
16630 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
16640 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
16650 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
16660 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
16670 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
16680 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
16690 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
166a0 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
166b0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
166c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
166d0 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
166e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
166f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16700 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
16710 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
16720 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
16730 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
16740 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
16750 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16760 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
16770 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
16780 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
16790 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
167a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
167b0 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
167c0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
167d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
167e0 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
167f0 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
16800 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
16810 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
16820 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
16830 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
16840 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
16850 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
16860 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
16870 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16880 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
16890 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
168c0 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
168d0 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
168e0 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
168f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
16900 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
16910 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
16920 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
16930 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
16940 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16950 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16960 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
16990 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
169a0 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
169b0 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
169c0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
169d0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
169e0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
169f0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
16a00 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
16a10 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16a20 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
16a30 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
16a40 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
16a50 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
16a60 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
16a70 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
16a80 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
16a90 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
16aa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
16ab0 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
16ac0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
16ad0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
16ae0 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
16af0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
16b00 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
16b10 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16b20 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
16b30 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
16b40 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
16b50 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
16b60 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
16b70 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
16b80 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
16b90 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
16ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16bb0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16bc0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
16bd0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
16be0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
16bf0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
16c00 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
16c10 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
16c20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16c30 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
16c40 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
16c50 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
16c60 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
16c70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
16c80 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
16c90 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
16ca0 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
16cb0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16cc0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16cd0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
16ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
16cf0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
16d00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
16d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
16d20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16d30 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16d40 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
16d50 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
16d60 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
16d70 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
16d80 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
16d90 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
16da0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
16db0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16dc0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
16dd0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
16de0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
16df0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
16e00 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
16e20 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
16e30 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16e40 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
16e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16e60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16e70 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16e80 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
16e90 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
16ea0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16eb0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
16ec0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16ed0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
16ee0 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
16ef0 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
16f00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16f10 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
16f20 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
16f30 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16f40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
16f50 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
16f60 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
16f70 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16f80 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
16f90 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16fa0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
16fb0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
16fc0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
16fd0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
16fe0 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
16ff0 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
17000 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
17010 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
17020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17030 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
17040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17050 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
17060 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
17070 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
17080 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
17090 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
170a0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
170b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
170c0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
170d0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
170e0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
170f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
17100 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17110 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
17120 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17130 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
17140 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17150 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
17160 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17170 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
17180 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
17190 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
171a0 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
171b0 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
171c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
171d0 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
171e0 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
171f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
17200 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
17210 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
17220 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
17230 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
17240 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
17250 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
17260 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
17270 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
17280 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
17290 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
172a0 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
172b0 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
172c0 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
172d0 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
172e0 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
172f0 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
17300 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
17310 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
17320 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
17330 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
17340 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  /.    assert( pF
17350 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
17360 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
17370 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64   || pFile->dbUpd
17380 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ate==0.         
17390 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e    || pFile->tran
173a0 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a  sCntrChng==1 );.
173b0 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
173c0 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
173d0 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66  ndif.    .    if
173e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
173f0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
17400 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
17410 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17420 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17430 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17440 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
17450 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
17460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
17470 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17480 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
17490 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20  >nShared>1) ){. 
174a0 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72         /* only r
174b0 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  e-establish the 
174c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e  shared lock if n
174d0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
174e0 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f      int sharedLo
174f0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
17500 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
17510 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20  aredByte;.      
17520 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
17530 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17540 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
17550 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
17560 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
17570 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72          skipShar
17580 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
17590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
175a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
175b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
175c0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
175d0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
175e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
175f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
17600 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
17610 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69  0);.    } .    i
17620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17630 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
17640 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
17650 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e  OCK && context->
17660 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
17670 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
17680 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17690 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
176a0 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
176b0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
176c0 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78   .        contex
176d0 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  t->reserved = 0;
176e0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
176f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17700 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
17710 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17720 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
17730 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70  red>1)){.      p
17740 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17750 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
17760 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17780 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
17790 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
177a0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
177b0 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
177c0 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
177d0 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
177e0 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
177f0 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
17800 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
17810 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
17820 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
17830 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
17840 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
17850 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
17860 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
17870 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
17880 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Byte;.    pInode
17890 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
178a0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
178b0 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
178c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
178d0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
178e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
178f0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20  ( h=(-1) ).     
17900 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17910 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
17920 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64   if( !skipShared
17930 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17940 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17950 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17960 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
17970 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
17980 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63   }.      if( !rc
17990 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
179a0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
179b0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
179c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
179d0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
179e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
179f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17a00 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
17a10 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20  ->nLock--;.     
17a20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
17a30 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
17a40 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
17a50 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
17a60 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
17a70 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
17a80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
17a90 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
17aa0 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
17ab0 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
17ac0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17ad0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
17ae0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
17af0 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
17b00 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
17b10 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
17b20 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t .*/.static int
17b30 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65   afpClose(sqlite
17b40 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
17b50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17b60 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
17b70 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
17b80 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
17b90 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f  )id;.    afpUnlo
17ba0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
17bb0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
17bc0 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70  tex();.    if( p
17bd0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
17be0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
17bf0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
17c00 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
17c10 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
17c20 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
17c30 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
17c40 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65  just.      ** ye
17c50 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
17c60 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
17c70 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
17c80 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
17c90 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
17ca0 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50  or to pInode->aP
17cb0 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
17cc0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
17cd0 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
17ce0 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
17cf0 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
17d00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17d10 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
17d20 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  le);.    }.    r
17d30 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
17d40 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  pFile);.    sqli
17d50 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
17d60 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
17d70 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
17d80 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
17d90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17da0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17db0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
17dc0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
17dd0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
17de0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
17df0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
17e00 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
17e10 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
17e20 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
17e30 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
17e40 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
17e50 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
17e60 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
17e70 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
17e80 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
17e90 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
17ea0 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
17eb0 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
17ec0 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
17ed0 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
17ee0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
17ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f00 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
17f10 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17f20 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
17f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
17f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
17fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ff0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
18000 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
18010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
18030 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18040 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18050 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18060 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
18070 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
18080 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
18090 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
180a0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
180b0 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ock. ** must be 
180c0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
180d0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
180e0 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
180f0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
18100 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
18110 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
18120 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
18130 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
18140 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
18150 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18160 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
18170 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
18180 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
18190 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
181a0 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
181b0 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
181c0 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  k, 1);.}..#endif
181d0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
181e0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
181f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
18200 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
18210 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
18220 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
18230 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
18240 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
18250 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
18260 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
18270 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
18280 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
18290 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
182a0 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a  s available.  .*
182b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
182c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
182d0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
182e0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
182f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18300 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
18310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18350 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
18360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
183b0 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
183c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
183d0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
183e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183f0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
18400 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
18410 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
18420 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
18430 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
18440 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
18450 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
18460 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
18470 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
18480 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
18490 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
184a0 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
184b0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
184c0 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
184d0 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
184e0 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
184f0 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
18500 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
18510 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
18520 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
18530 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
18540 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
18550 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
18560 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
18570 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
18580 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
18590 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
185a0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
185b0 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
185c0 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
185d0 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
185e0 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
185f0 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
18600 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
18610 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
18620 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
18630 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
18640 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
18650 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
18660 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
18670 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
18680 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
18690 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
186a0 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
186b0 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
186c0 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
186d0 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
186e0 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
186f0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
18700 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
18710 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
18720 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
18730 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
18740 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
18750 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
18760 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
18770 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
18780 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
18790 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
187a0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
187b0 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69  t got;.  int pri
187c0 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65  or = 0;.#if (!de
187d0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
187e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
187f0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
18800 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
18810 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
18820 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
18830 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
18840 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
18850 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18860 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
18870 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18880 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
18890 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
188a0 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
188b0 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
188c0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
188d0 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
188e0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
188f0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
18900 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
18910 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
18920 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
18930 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18940 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
18950 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
18960 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
18970 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
18980 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
18990 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
189a0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
189b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
189c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
189d0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
189e0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
189f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18a00 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
18a10 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28     got = osRead(
18a20 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18a30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
18a40 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65  ( got==cnt ) bre
18a50 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c  ak;.    if( got<
18a60 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
18a70 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67  rrno==EINTR ){ g
18a80 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65  ot = 1; continue
18a90 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ; }.      prior 
18aa0 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75 6e 69  = 0;.      ((uni
18ab0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18ac0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18ad0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18ae0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
18af0 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
18b00 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
18b10 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
18b20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
18b30 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
18b40 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
18b50 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
18b60 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
18b70 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
18b80 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
18b90 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
18ba0 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
18bb0 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
18bc0 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
18bd0 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
18be0 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
18bf0 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
18c00 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
18c10 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
18c20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
18c30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
18c40 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
18c50 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
18c60 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
18c70 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
18c80 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
18c90 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
18ca0 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
18cb0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
18cc0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
18cd0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
18ce0 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
18cf0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
18d00 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
18d10 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
18d20 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20  ssert( id );..  
18d30 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
18d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
18d50 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
18d60 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
18d70 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
18d80 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
18d90 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
18da0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
18db0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
18dc0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
18dd0 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
18de0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
18df0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
18e00 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
18e10 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
18e20 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
18e30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20  ;.#endif..  got 
18e40 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
18e50 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
18e60 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
18e70 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
18e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18e90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
18ea0 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
18eb0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
18ec0 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
18ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18ee0 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
18ef0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
18f00 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
18f10 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
18f20 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e  ror */.    /* Un
18f30 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
18f40 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
18f50 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
18f60 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
18f70 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
18f80 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
18f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18fa0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
18fb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
18fc0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
18fd0 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
18fe0 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
18ff0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
19000 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19010 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
19020 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
19030 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
19040 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
19050 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
19060 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
19070 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
19080 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
19090 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
190a0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
190b0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
190c0 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
190d0 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
190e0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
190f0 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19100 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  got;.#if (!defin
19110 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
19120 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
19130 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
19140 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
19150 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
19160 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19170 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20  READ).  do{ got 
19180 3d 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68  = osPwrite(id->h
19190 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
191a0 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
191b0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
191c0 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
191d0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
191e0 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
191f0 50 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  Pwrite64(id->h, 
19200 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19210 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  t);}while( got<0
19220 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
19230 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
19240 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c     newOffset = l
19250 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
19260 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
19270 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19280 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20  or( newOffset-- 
19290 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  );.    if( newOf
192a0 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
192b0 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66        if( newOff
192c0 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
192d0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
192e0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
192f0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d  = errno;.      }
19300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28  else{.        ((
19310 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
19320 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
19330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19340 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
19350 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72 69 74      got = osWrit
19360 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
19370 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 67  nt);.  }while( g
19380 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
19390 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20  INTR );.#endif. 
193a0 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66   TIMER_END;.  if
193b0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28  ( got<0 ){.    (
193c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
193d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
193e0 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  o;.  }..  OSTRAC
193f0 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64  E(("WRITE   %-3d
19400 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
19410 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
19420 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
19430 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
19440 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n got;.}.../*.**
19450 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
19460 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
19470 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
19480 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
19490 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
194a0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
194b0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
194c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
194d0 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
194e0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
194f0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
19500 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
19510 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
19520 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20   .){.  unixFile 
19530 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
19540 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72  le*)id;.  int wr
19550 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
19560 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
19570 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
19580 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
19590 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
195a0 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
195b0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
195c0 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
195d0 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
195e0 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
195f0 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
19600 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
19610 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
19620 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
19630 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
19640 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
19650 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
19660 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
19670 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
19680 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
19690 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
196a0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
196b0 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
196c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
196d0 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
196e0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
196f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
19700 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
19710 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
19720 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
19730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
19740 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
19750 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
19760 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
19770 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
19780 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19790 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
197a0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
197b0 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
197c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
197d0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
197e0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
197f0 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
19800 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
19810 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
19820 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
19830 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
19840 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
19850 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
19860 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
19870 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19880 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
19890 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
198a0 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
198b0 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
198c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
198d0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
198e0 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
198f0 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
19900 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
19910 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
19920 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
19930 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
19940 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
19950 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
19960 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
19970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19980 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
19990 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
199a0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
199b0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
199c0 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
199d0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
199e0 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
199f0 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
19a00 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
19a10 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
19a20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19a30 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
19a40 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
19a50 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
19a60 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
19a70 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
19a80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
19a90 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
19aa0 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
19ab0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
19ac0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
19ad0 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
19ae0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19af0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
19b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b10 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19b20 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
19b30 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
19b40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19b50 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19b60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
19b80 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
19b90 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
19ba0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
19bb0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
19bc0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
19bd0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
19be0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
19bf0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
19c00 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
19c10 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
19c20 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
19c30 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
19c40 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
19c50 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
19c60 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
19c70 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
19c80 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
19c90 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
19ca0 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
19cb0 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
19cc0 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
19cd0 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
19ce0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
19cf0 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
19d00 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
19d10 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
19d20 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
19d30 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
19d40 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
19d50 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
19d60 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
19d70 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
19d80 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69  datasync).# defi
19d90 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
19da0 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
19db0 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
19dc0 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
19dd0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
19de0 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
19df0 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
19e00 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
19e10 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
19e20 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
19e30 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
19e40 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
19e50 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
19e60 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
19e70 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
19e80 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
19e90 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
19ea0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
19eb0 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
19ec0 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
19ed0 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
19ee0 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
19ef0 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
19f00 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
19f10 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
19f20 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
19f30 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
19f40 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
19f50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
19f60 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
19f70 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
19f80 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
19f90 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
19fa0 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
19fb0 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
19fc0 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
19fd0 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
19fe0 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
19ff0 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1a000 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1a010 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1a020 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1a030 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1a040 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1a050 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1a060 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1a070 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1a080 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1a090 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1a0a0 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1a0b0 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1a0c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a0d0 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1a0e0 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1a0f0 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1a100 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1a110 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1a120 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1a130 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1a140 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1a150 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1a160 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1a170 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1a180 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1a190 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1a1a0 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1a1b0 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1a1c0 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1a1d0 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1a1e0 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1a1f0 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1a200 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1a210 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1a220 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1a230 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1a240 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1a250 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1a260 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1a270 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1a280 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1a290 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1a2a0 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1a2b0 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1a2c0 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1a2d0 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1a2e0 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1a2f0 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1a300 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1a310 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1a320 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1a330 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1a340 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1a350 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1a360 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1a370 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1a380 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1a390 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1a3a0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1a3b0 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1a3c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a3d0 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1a3e0 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1a3f0 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1a400 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1a410 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1a420 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1a430 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1a440 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1a450 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1a460 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1a470 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1a480 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1a490 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1a4a0 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1a4b0 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1a4c0 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1a4d0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1a4e0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1a4f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1a500 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1a510 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1a520 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a530 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1a540 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1a550 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1a560 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1a570 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1a580 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1a590 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1a5a0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1a5b0 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1a5c0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1a5d0 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1a5e0 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1a5f0 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1a600 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1a610 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1a620 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1a630 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1a640 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1a650 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1a660 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1a670 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1a680 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1a690 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1a6a0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1a6b0 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1a6c0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1a6d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1a6e0 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1a6f0 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1a700 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1a710 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1a720 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
1a730 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1a740 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
1a750 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
1a760 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1a770 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1a780 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1a790 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1a7a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1a7b0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1a7c0 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1a7d0 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1a7e0 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1a7f0 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1a800 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1a810 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1a820 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1a830 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1a840 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1a850 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1a860 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1a870 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1a880 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1a890 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1a8a0 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1a8b0 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1a8c0 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1a8d0 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1a8e0 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1a8f0 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1a900 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1a910 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1a920 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1a930 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1a940 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1a950 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1a960 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1a970 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1a980 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1a990 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1a9a0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1a9b0 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1a9c0 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1a9d0 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1a9e0 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1a9f0 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1aa00 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1aa10 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1aa20 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1aa30 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1aa40 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1aa50 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1aa60 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1aa70 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1aa80 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1aa90 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1aaa0 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1aab0 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1aac0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1aad0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1aae0 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1aaf0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1ab00 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1ab10 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1ab20 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1ab30 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1ab40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ab50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1ab60 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1ab70 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1ab80 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1ab90 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1aba0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1abb0 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1abc0 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1abd0 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1abe0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1abf0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1ac00 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1ac10 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1ac20 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1ac30 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1ac40 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1ac50 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1ac60 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1ac70 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1ac80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ac90 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1aca0 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1acb0 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1acc0 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1acd0 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1ace0 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1acf0 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1ad00 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1ad10 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1ad20 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1ad30 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1ad40 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1ad50 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1ad60 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1ad70 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1ad80 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1ad90 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1ada0 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1adb0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1adc0 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1add0 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1ade0 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1adf0 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1ae00 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1ae10 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1ae20 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1ae30 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1ae40 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1ae50 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1ae60 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1ae70 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1ae80 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1ae90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1aea0 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1aeb0 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1aec0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1aed0 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1aee0 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1aef0 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1af00 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1af10 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1af20 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1af30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1af40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1af50 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1af60 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1af70 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1af80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1af90 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1afa0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1afb0 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1afc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1afd0 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1afe0 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1aff0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1b000 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1b010 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1b020 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1b030 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1b040 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1b050 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1b060 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1b070 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1b080 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1b090 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1b0a0 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1b0b0 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1b0c0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
1b0d0 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1b0e0 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1b0f0 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1b100 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  fd>=0 ){.#ifdef 
1b110 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20  FD_CLOEXEC.     
1b120 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53   osFcntl(fd, F_S
1b130 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64  ETFD, osFcntl(fd
1b140 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
1b150 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
1b160 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
1b170 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E(("OPENDIR %-3d
1b180 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
1b190 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  name));.    }.  
1b1a0 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
1b1b0 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
1b1c0 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67  QLITE_OK:unixLog
1b1d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1b1e0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1b1f0 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  n", zDirname));.
1b200 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1b210 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1b220 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1b230 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1b240 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1b250 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
1b260 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
1b270 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
1b280 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
1b290 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
1b2a0 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
1b2b0 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
1b2c0 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
1b2d0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
1b2e0 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
1b2f0 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
1b300 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
1b310 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
1b320 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1b330 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
1b340 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
1b350 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
1b360 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
1b370 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
1b380 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
1b390 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
1b3a0 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
1b3b0 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
1b3c0 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
1b3d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1b3e0 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
1b3f0 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
1b400 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
1b410 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
1b420 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
1b430 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
1b440 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
1b450 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
1b460 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1b470 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
1b480 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
1b490 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b4a0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
1b4b0 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
1b4c0 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
1b4d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1b4e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b4f0 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
1b500 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
1b510 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
1b520 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1b530 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1b540 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
1b550 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
1b560 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1b570 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
1b580 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
1b590 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1b5a0 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
1b5b0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
1b5c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1b5d0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
1b5e0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
1b5f0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
1b600 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
1b610 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
1b620 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1b630 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
1b640 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
1b650 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
1b660 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
1b670 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
1b680 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
1b690 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
1b6a0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
1b6b0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1b6c0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
1b6d0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1b6e0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
1b6f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
1b700 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1b710 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1b720 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
1b730 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1b740 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1b750 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1b760 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1b770 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b780 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1b790 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1b7a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1b7b0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1b7c0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1b7d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
1b7e0 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c  C, "full_fsync",
1b7f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1b800 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66    }..  /* Also f
1b810 73 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f  sync the directo
1b820 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
1b830 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49  e file if the DI
1b840 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20  RSYNC flag.  ** 
1b850 69 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73  is set.  This is
1b860 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75   a one-time occu
1b870 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79  rrance.  Many sy
1b880 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a  stems (examples:
1b890 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75   AIX).  ** are u
1b8a0 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61  nable to fsync a
1b8b0 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69   directory, so i
1b8c0 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20  gnore errors on 
1b8d0 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a  the fsync..  */.
1b8e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
1b8f0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
1b900 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20  E_DIRSYNC ){.   
1b910 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20   int dirfd;.    
1b920 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e  OSTRACE(("DIRSYN
1b930 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66  C %s (have_fullf
1b940 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63  sync=%d fullsync
1b950 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%d)\n", pFile->
1b960 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20  zPath,.         
1b970 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e     HAVE_FULLFSYN
1b980 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b  C, isFullsync));
1b990 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
1b9a0 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d  Directory(pFile-
1b9b0 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  >zPath, &dirfd);
1b9c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b9d0 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e  ITE_OK && dirfd>
1b9e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  =0 ){.      full
1b9f0 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1ba00 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1ba10 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1ba20 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1ba30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
1ba40 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
1ba50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
1ba60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ba70 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  }.    pFile->ctr
1ba80 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46  lFlags &= ~UNIXF
1ba90 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d  ILE_DIRSYNC;.  }
1baa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bab0 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
1bac0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
1bad0 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
1bae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1baf0 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nixTruncate(sqli
1bb00 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1bb10 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78  4 nByte){.  unix
1bb20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1bb30 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
1bb40 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
1bb50 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
1bb60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1bb70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1bb80 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20  R_TRUNCATE );.. 
1bb90 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
1bba0 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
1bbb0 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
1bbc0 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
1bbd0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
1bbe0 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
1bbf0 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
1bc00 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
1bc10 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
1bc20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
1bc30 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
1bc40 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
1bc50 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1bc60 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
1bc70 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
1bc80 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1bc90 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
1bca0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
1bcb0 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
1bcc0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1bcd0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1bce0 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
1bcf0 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1bd00 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79  e->h, (off_t)nBy
1bd10 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
1bd20 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1bd30 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1bd40 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1bd50 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1bd60 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1bd70 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1bd80 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1bd90 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  e{.#ifndef NDEBU
1bda0 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  G.    /* If we a
1bdb0 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1bdc0 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1bdd0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1bde0 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a  pposed to.    **
1bdf0 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1be00 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1be10 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1be20 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1be30 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c   a.    ** normal
1be40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1be50 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20  and we truncate 
1be60 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1be70 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20   length,.    ** 
1be80 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79  that effectively
1be90 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1bea0 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68  nge counter.  Th
1beb0 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a  is might happen.
1bec0 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74      ** when rest
1bed0 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  oring a database
1bee0 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75   using the backu
1bef0 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72  p API from a zer
1bf00 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  o-length.    ** 
1bf10 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20  source..    */. 
1bf20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e     if( pFile->in
1bf30 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e  NormalWrite && n
1bf40 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1bf50 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
1bf60 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
1bf70 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
1bf80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bf90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
1bfa0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
1bfb0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
1bfc0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
1bfd0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1bfe0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1bff0 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
1c000 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
1c010 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1c020 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1c030 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
1c040 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1c050 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
1c060 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1c070 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
1c080 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
1c090 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
1c0a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1c0b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1c0c0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
1c0d0 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
1c0e0 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68  t_size;..  /* Wh
1c0f0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72  en opening a zer
1c100 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c  o-size database,
1c110 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e   the findInodeIn
1c120 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20  fo() procedure. 
1c130 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e   ** writes a sin
1c140 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68  gle byte into th
1c150 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  at file in order
1c160 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1c170 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68  a bug.  ** in th
1c180 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c  e OS-X msdos fil
1c190 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64  esystem.  In ord
1c1a0 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
1c1b0 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a  lems with upper.
1c1c0 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20    ** layers, we 
1c1d0 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  need to report t
1c1e0 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73  his file size as
1c1f0 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67   zero even thoug
1c200 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61  h it is.  ** rea
1c210 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20  lly 1.   Ticket 
1c220 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3260..  */.  if
1c230 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70  ( *pSize==1 ) *p
1c240 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65  Size = 0;...  re
1c250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c260 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
1c270 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1c280 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1c290 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48  APPLE__)./*.** H
1c2a0 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79  andler for proxy
1c2b0 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f  -locking file-co
1c2c0 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65  ntrol verbs.  De
1c2d0 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74  fined below in t
1c2e0 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c  he.** proxying l
1c2f0 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e  ocking division.
1c300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1c310 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1c320 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1c330 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66  t,void*);.#endif
1c340 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  ../* .** This fu
1c350 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c360 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53   to handle the S
1c370 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1c380 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63  _HINT .** file-c
1c390 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e  ontrol operation
1c3a0 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64  .  Enlarge the d
1c3b0 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65  atabase to nByte
1c3c0 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f  s in size.** (ro
1c3d0 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20  unded up to the 
1c3e0 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29  next chunk-size)
1c3f0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1c400 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  se is already.**
1c410 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65   nBytes or large
1c420 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
1c430 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1c440 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53  tatic int fcntlS
1c450 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65  izeHint(unixFile
1c460 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79   *pFile, i64 nBy
1c470 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65  te){.  if( pFile
1c480 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1c490 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20     i64 nSize;   
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c   /* Required fil
1c4c0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
1c4d0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20  ruct stat buf;  
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c4f0 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75  sed to hold retu
1c500 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74  rn values of fst
1c510 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20  at() */.   .    
1c520 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c  if( osFstat(pFil
1c530 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72 65  e->h, &buf) ) re
1c540 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1c550 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e 53  R_FSTAT;..    nS
1c560 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46  ize = ((nByte+pF
1c570 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20  ile->szChunk-1) 
1c580 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  / pFile->szChunk
1c590 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1c5a0 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  nk;.    if( nSiz
1c5b0 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69  e>(i64)buf.st_si
1c5c0 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  ze ){..#if defin
1c5d0 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
1c5e0 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
1c5f0 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1c600 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
1c610 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64  de below is hand
1c620 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  ling the return 
1c630 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f  value of osFallo
1c640 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a  cate() .      **
1c650 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69   correctly. posi
1c660 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73  x_fallocate() is
1c670 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74   defined to "ret
1c680 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63  urns zero on suc
1c690 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20  cess, .      ** 
1c6a0 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62  or an error numb
1c6b0 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e  er on  failure".
1c6c0 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65   See the manpage
1c6d0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1c6e0 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a  .      int err;.
1c6f0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
1c700 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63    err = osFalloc
1c710 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75  ate(pFile->h, bu
1c720 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65  f.st_size, nSize
1c730 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  -buf.st_size);. 
1c740 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72       }while( err
1c750 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
1c760 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72   if( err ) retur
1c770 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1c780 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RITE;.#else.    
1c790 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64    /* If the OS d
1c7a0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73  oes not have pos
1c7b0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20  ix_fallocate(), 
1c7c0 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20 75  fake it. First u
1c7d0 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72 75  se.      ** ftru
1c7e0 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20 74  ncate() to set t
1c7f0 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74 68  he file size, th
1c800 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  en write a singl
1c810 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20 20  e byte to.      
1c820 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  ** the last byte
1c830 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 77   in each block w
1c840 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64  ithin the extend
1c850 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a  ed region. This.
1c860 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
1c870 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20 75  same technique u
1c880 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f 20  sed by glibc to 
1c890 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f  implement posix_
1c8a0 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20 20  fallocate().    
1c8b0 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20    ** on systems 
1c8c0 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
1c8d0 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74   a real fallocat
1c8e0 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  e() system call.
1c8f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c900 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73  int nBlk = buf.s
1c910 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46  t_blksize;  /* F
1c920 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b  ile-system block
1c930 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69   size */.      i
1c940 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20  64 iWrite;      
1c950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1c960 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69  xt offset to wri
1c970 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20  te to */..      
1c980 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1c990 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1c9a0 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Size) ){.       
1c9b0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1c9c0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
1c9d0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1c9e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1c9f0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1ca00 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1ca10 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1ca20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  }.      iWrite =
1ca30 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b   ((buf.st_size +
1ca40 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c   2*nBlk - 1)/nBl
1ca50 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20  k)*nBlk-1;.     
1ca60 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e   while( iWrite<n
1ca70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1ca80 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65  int nWrite = see
1ca90 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1caa0 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b   iWrite, "", 1);
1cab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72  .        if( nWr
1cac0 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20  ite!=1 ) return 
1cad0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1cae0 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69  TE;.        iWri
1caf0 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20  te += nBlk;.    
1cb00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1cb10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1cb20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cb30 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
1cb40 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
1cb50 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1cb60 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1cb70 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1cb80 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1cb90 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1cba0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1cbb0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1cbc0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1cbd0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1cbe0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1cbf0 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1cc00 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1cc10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cc20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1cc30 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1cc40 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1cc50 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1cc60 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1cc70 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1cc80 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1cc90 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1cca0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1ccb0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1ccc0 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1ccd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1cce0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1ccf0 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1cd00 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
1cd10 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
1cd20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
1cd30 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1cd40 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
1cd50 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1cd60 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1cd70 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78  d *pArg){.  unix
1cd80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1cd90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
1cda0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1cdb0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1cdc0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1cdd0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1cde0 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1cdf0 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1ce00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ce10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1ce20 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
1ce30 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1ce40 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
1ce50 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
1ce60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ce70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ce80 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
1ce90 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
1cea0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
1ceb0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
1cec0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ced0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1cee0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1cef0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
1cf00 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1cf10 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1cf20 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1cf30 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
1cf40 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
1cf50 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
1cf60 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1cf70 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1cf80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cf90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1cfa0 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
1cfb0 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75  T_WAL: {.      u
1cfc0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1cfd0 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  , UNIXFILE_PERSI
1cfe0 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
1cff0 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
1d000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1d010 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1d020 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
1d030 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
1d040 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
1d050 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
1d060 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
1d070 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
1d080 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1d090 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1d0a0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
1d0b0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
1d0c0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1d0d0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1d0e0 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
1d0f0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1d100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1d110 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1d120 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 3a  TE_FCNTL_PRAGMA:
1d130 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a   {.      char **
1d140 61 7a 41 72 67 20 3d 20 28 63 68 61 72 2a 2a 29  azArg = (char**)
1d150 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  pArg;.      if( 
1d160 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1d170 61 7a 41 72 67 5b 31 5d 2c 20 22 66 69 6c 65 6e  azArg[1], "filen
1d180 61 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ame")==0 ){.    
1d190 20 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 73      azArg[0] = s
1d1a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1d1b0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
1d1c0 68 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  h);.        retu
1d1d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1d1f0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1d200 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54   NDEBUG.    /* T
1d210 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74  he pager calls t
1d220 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69  his method to si
1d230 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73  gnal that it has
1d240 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72   done.    ** a r
1d250 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ollback and that
1d260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d270 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61   therefore uncha
1d280 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  nged and.    ** 
1d290 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f  it hence it is O
1d2a0 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61  K for the transa
1d2b0 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75  ction change cou
1d2c0 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a  nter to be.    *
1d2d0 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  * unchanged..   
1d2e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d2f0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1d300 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20  HANGED: {.      
1d310 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1d320 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
1d330 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d340 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
1d350 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1d360 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1d370 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1d380 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61  _APPLE__).    ca
1d390 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  se SQLITE_SET_LO
1d3a0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20  CKPROXYFILE:.   
1d3b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54   case SQLITE_GET
1d3c0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
1d3d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1d3e0 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1d3f0 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
1d400 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1d410 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1d420 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1d430 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
1d440 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
1d450 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1d460 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d470 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1d480 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
1d490 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
1d4a0 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
1d4b0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1d4c0 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
1d4d0 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
1d4e0 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
1d4f0 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
1d500 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
1d510 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
1d520 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
1d530 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
1d540 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
1d550 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
1d560 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
1d570 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
1d580 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
1d590 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
1d5a0 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
1d5b0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
1d5c0 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
1d5d0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
1d5e0 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
1d5f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1d600 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1d610 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1d620 29 7b 0a 20 20 28 76 6f 69 64 29 70 46 69 6c 65  ){.  (void)pFile
1d630 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d640 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1d650 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
1d660 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
1d670 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1d680 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  s for the file..
1d690 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69  **.** This VFS i
1d6a0 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75  s set up to retu
1d6b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
1d6c0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1d6d0 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a  ITE by default..
1d6e0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  ** However, that
1d6f0 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72   choice is contr
1d700 61 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74  aversial since t
1d710 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75  echnically the u
1d720 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c  nderlying.** fil
1d730 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  e system does no
1d740 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65  t always provide
1d750 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77   powersafe overw
1d760 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65  rites.  (In othe
1d770 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65  r.** words, afte
1d780 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65  r a power-loss e
1d790 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74  vent, parts of t
1d7a0 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72  he file that wer
1d7b0 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74  e never.** writt
1d7c0 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  en might end up 
1d7d0 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20  being altered.) 
1d7e0 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53   However, non-PS
1d7f0 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76  OW behavior is v
1d800 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72  ery,.** very rar
1d810 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e  e.  And assertin
1d820 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c  g PSOW makes a l
1d830 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69  arge reduction i
1d840 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  n the amount.** 
1d850 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20  of required I/O 
1d860 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20  for journaling, 
1d870 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70  since a lot of p
1d880 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e  adding is elimin
1d890 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c  ated..**  Hence,
1d8a0 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45   while POWERSAFE
1d8b0 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e  _OVERWRITE is on
1d8c0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65   by default, the
1d8d0 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e  re is a file-con
1d8e0 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  trol.** availabl
1d8f0 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
1d900 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70   and URI query p
1d910 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62  arameter availab
1d920 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
1d930 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
1d940 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
1d950 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1d960 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1d970 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
1d980 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1d990 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20  f( p->ctrlFlags 
1d9a0 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  & UNIXFILE_PSOW 
1d9b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1d9c0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1d9d0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a  SAFE_OVERWRITE;.
1d9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1d9f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  urn 0;.  }.}..#i
1da00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1da10 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62  T_WAL.../*.** Ob
1da20 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
1da30 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64  resent an shared
1da40 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20   memory buffer. 
1da50 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c   .**.** When mul
1da60 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
1da70 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
1da80 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20  same wal-index, 
1da90 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68  each thread.** h
1daa0 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53  as its own unixS
1dab0 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  hm object, but t
1dac0 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  hey all point to
1dad0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
1dae0 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e  ce.** of this un
1daf0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1db00 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1db10 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65  s, each wal-inde
1db20 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  x is opened.** o
1db30 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
1db40 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  cess..**.** Each
1db50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1db60 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  ect is connected
1db70 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69   to a single uni
1db80 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
1db90 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63  t..** We could c
1dba0 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a  oalesce this obj
1dbb0 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f  ect into unixIno
1dbc0 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74  deInfo, but that
1dbd0 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65   would mean.** e
1dbe0 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74  very open file t
1dbf0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
1dc00 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28   shared memory (
1dc10 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
1dc20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c  most.** open fil
1dc30 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74  es) would have t
1dc40 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74  o carry around t
1dc50 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  his extra inform
1dc60 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68  ation.  So.** th
1dc70 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
1dc80 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
1dc90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
1dca0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1dcb0 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ject.** and the 
1dcc0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1dcd0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  ct is created on
1dce0 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a  ly when needed..
1dcf0 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
1dd00 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
1dd10 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
1dd20 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
1dd30 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
1dd40 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1dd50 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
1dd60 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
1dd70 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
1dd80 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1dd90 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
1dda0 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
1ddb0 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
1ddc0 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
1ddd0 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
1dde0 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
1ddf0 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ther unixShmNode
1de00 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
1de10 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f  eld or unixShmNo
1de20 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
1de30 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
1de40 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
1de50 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1de60 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
1de70 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
1de80 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
1de90 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a  t unixShmNode {.
1dea0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1deb0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  *pInode;     /* 
1dec0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68  unixInodeInfo th
1ded0 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d  at owns this SHM
1dee0 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
1def0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
1df00 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
1df10 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
1df20 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
1df30 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
1df40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1df50 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  the mmapped file
1df60 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df80 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
1df90 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
1dfa0 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
1dfb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1dfc0 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1dfd0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75  y regions */.  u
1dfe0 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  16 nRegion;     
1dff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1e000 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
1e010 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65  ion */.  u8 isRe
1e020 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
1e030 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1e040 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68  ead-only */.  ch
1e050 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
1e060 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1e070 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
1e080 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1e090 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1e0c0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1e0d0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1e0e0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
1e0f0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1e100 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
1e110 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1e120 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65  to this */.#ifde
1e130 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1e140 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
1e150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1e160 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1e170 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1e180 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
1e190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1e1a0 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
1e1b0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
1e1c0 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
1e1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1e1e0 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53   available unixS
1e1f0 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
1e200 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1e210 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
1e220 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
1e230 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
1e240 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
1e250 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
1e260 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
1e270 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
1e280 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1e290 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
1e2a0 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
1e2b0 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
1e2c0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
1e2d0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
1e2e0 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65     unixShm.pFile
1e2f0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69  .**    unixShm.i
1e300 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
1e310 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
1e320 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e  d/write.  The un
1e330 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74  ixShm.pFile->mut
1e340 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
1e350 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
1e360 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
1e370 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
1e380 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20  uct unixShm {.  
1e390 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1e3a0 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68  mNode;     /* Th
1e3b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69  e underlying uni
1e3c0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1e3d0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e  */.  unixShm *pN
1e3e0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1e3f0 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20  /* Next unixShm 
1e400 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e  with the same un
1e410 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
1e420 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
1e430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e440 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
1e450 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74   unixShmNode mut
1e460 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20  ex */.  u8 id;  
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1e490 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1e4a0 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1e4b0 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  de */.  u16 shar
1e4c0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1e4d0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
1e4e0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
1e4f0 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
1e500 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1e510 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1e520 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1e530 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
1e540 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
1e550 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
1e560 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
1e570 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
1e580 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
1e590 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
1e5a0 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
1e5b0 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
1e5c0 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
1e5d0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
1e5e0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
1e5f0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
1e600 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
1e610 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
1e620 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
1e630 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
1e640 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
1e650 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
1e660 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
1e670 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
1e680 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
1e690 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
1e6a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1e6b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
1e6c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1e6d0 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20  mNode, /* Apply 
1e6e0 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
1e6f0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
1e700 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
1e710 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
1e720 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
1e730 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
1e740 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
1e750 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1e760 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
1e770 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
1e780 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e7b0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
1e7c0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
1e7d0 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  f;       /* The 
1e7e0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
1e7f0 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
1e800 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1e810 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52  QLITE_OK;   /* R
1e820 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
1e830 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
1e840 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
1e850 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1e860 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
1e870 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
1e880 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e890 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53  e3_mutex_held(pS
1e8a0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c  hmNode->mutex) |
1e8b0 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  | pShmNode->nRef
1e8c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ==0 );..  /* Sha
1e8d0 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
1e8e0 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
1e8f0 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
1e900 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
1e910 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
1e920 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
1e930 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
1e940 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
1e950 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d   && n<SQLITE_SHM
1e960 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  _NLOCK );..  if(
1e970 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
1e980 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
1e990 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
1e9a0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1e9b0 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c     memset(&f, 0,
1e9c0 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20   sizeof(f));.   
1e9d0 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
1e9e0 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68  Type;.    f.l_wh
1e9f0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
1ea00 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  .    f.l_start =
1ea10 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c   ofst;.    f.l_l
1ea20 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20  en = n;..    rc 
1ea30 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  = osFcntl(pShmNo
1ea40 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  de->h, F_SETLK, 
1ea50 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72  &f);.    rc = (r
1ea60 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54  c!=(-1)) ? SQLIT
1ea70 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55  E_OK : SQLITE_BU
1ea80 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  SY;.  }..  /* Up
1ea90 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  date the global 
1eaa0 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64  lock state and d
1eab0 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20  o debug tracing 
1eac0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1ead0 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d  _DEBUG.  { u16 m
1eae0 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ask;.  OSTRACE((
1eaf0 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20  "SHM-LOCK "));. 
1eb00 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
1eb10 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
1eb20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1eb30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1eb40 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
1eb50 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
1eb60 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
1eb70 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
1eb80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
1eb90 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1eba0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1ebb0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1ebc0 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  mask;.    }else 
1ebd0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1ebe0 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
1ebf0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
1ec00 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
1ec10 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
1ec20 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
1ec30 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
1ec40 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1ec50 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65   |= mask;.    }e
1ec60 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1ec70 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
1ec80 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
1ec90 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
1eca0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
1ecb0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
1ecc0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  e->exclMask |= m
1ecd0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1ece0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1ecf0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a  &= ~mask;.    }.
1ed00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1ed10 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
1ed20 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1ed30 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
1ed40 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
1ed50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1ed60 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
1ed70 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1ed80 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61  E(("read-lock fa
1ed90 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
1eda0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1edb0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
1edc0 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
1edd0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
1ede0 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
1edf0 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
1ee00 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61    OSTRACE((" - a
1ee10 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25  fterwards %03x,%
1ee20 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
1ee30 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1ee40 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64  redMask, pShmNod
1ee50 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  e->exclMask));. 
1ee60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1ee70 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
1ee80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  }.../*.** Purge 
1ee90 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c  the unixShmNodeL
1eea0 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
1eeb0 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69  entries with uni
1eec0 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
1eed0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1eee0 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
1eef0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
1ef00 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
1ef10 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
1ef20 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
1ef30 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
1ef40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ef50 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69  unixShmPurge(uni
1ef60 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75  xFile *pFd){.  u
1ef70 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20  nixShmNode *p = 
1ef80 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  pFd->pInode->pSh
1ef90 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
1efa0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1efb0 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
1efc0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1efd0 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
1efe0 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70  rt( p->pInode==p
1eff0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
1f000 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f010 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
1f020 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1f030 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
1f040 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  .      if( p->h>
1f050 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75  =0 ){.        mu
1f060 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e  nmap(p->apRegion
1f070 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e  [i], p->szRegion
1f080 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1f0a0 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
1f0b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
1f0c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1f0d0 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
1f0e0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  );.    if( p->h>
1f0f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
1f100 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d  st_close(pFd, p-
1f110 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
1f120 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a       p->h = -1;.
1f130 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e      }.    p->pIn
1f140 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1f150 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
1f160 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
1f170 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72  *.** Open a shar
1f180 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
1f190 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f  ssociated with o
1f1a0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1f1b0 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68  e pDbFd.  .** Th
1f1c0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d  is particular im
1f1d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
1f1e0 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e  s mmapped files.
1f1f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
1f200 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f210 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  t shared-memory 
1f220 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  is in the same d
1f230 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74  irectory.** as t
1f240 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1f250 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68   file and has th
1f260 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
1f270 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1f280 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68  .** file with th
1f290 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20  e "-shm" suffix 
1f2a0 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d  added.  For exam
1f2b0 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61  ple, if the data
1f2c0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20  base file.** is 
1f2d0 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
1f2e0 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65  fig.db" then the
1f2f0 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72   file that is cr
1f300 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  eated and mmappe
1f310 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20  d.** for shared 
1f320 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63  memory will be c
1f330 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65  alled "/home/use
1f340 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d  r1/config.db-shm
1f350 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68  ".  .**.** Anoth
1f360 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69  er approach to i
1f370 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69  s to use files i
1f380 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64  n /dev/shm or /d
1f390 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20  ev/tmp or an.** 
1f3a0 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73  some other tmpfs
1f3b0 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61   mount. But if a
1f3c0 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65   file in a diffe
1f3d0 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a  rent directory.*
1f3e0 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  * from the datab
1f3f0 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64  ase file is used
1f400 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67  , then differing
1f410 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
1f420 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f  ons.** or a chro
1f430 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65  ot() might cause
1f440 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70   two different p
1f450 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20  rocesses on the 
1f460 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  same.** database
1f470 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67   to end up using
1f480 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73   different files
1f490 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
1f4a0 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  ry - .** meaning
1f4b0 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f   that their memo
1f4c0 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61  ry would not rea
1f4d0 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20  lly be shared - 
1f4e0 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20  resulting.** in 
1f4f0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1f500 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ion.  Neverthele
1f510 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66  ss, this tmpfs f
1f520 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e  ile usage.** can
1f530 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63   be enabled at c
1f540 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e  ompile-time usin
1f550 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44  g -DSQLITE_SHM_D
1f560 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73  IRECTORY="/dev/s
1f570 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71  hm".** or the eq
1f580 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75  uivalent.  The u
1f590 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  se of the SQLITE
1f5a0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
1f5b0 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f  ompile-time.** o
1f5c0 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ption results in
1f5d0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1f5e0 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65   build of SQLite
1f5f0 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c  ;  builds of SQL
1f600 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68  ite.** that with
1f610 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54   differing SQLIT
1f620 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1f630 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74  settings attempt
1f640 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73   to use the.** s
1f650 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
1f660 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
1f670 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72  me, database cor
1f680 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b  ruption will lik
1f690 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54  ely.** result. T
1f6a0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1f6b0 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1f6c0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63  time option is c
1f6d0 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e  onsidered.** "un
1f6e0 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d  supported" and m
1f6f0 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20  ay go away in a 
1f700 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65  future SQLite re
1f710 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lease..**.** Whe
1f720 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
1f730 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1f740 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
1f750 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
1f760 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
1f770 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
1f780 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
1f790 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
1f7a0 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
1f7b0 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
1f7c0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1f7d0 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
1f7e0 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
1f7f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1f800 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
1f810 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69  e file (pDbFd) i
1f820 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69  s using the "uni
1f830 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74  x-excl" VFS.** t
1f840 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
1f850 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1f860 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
1f870 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1f880 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68  d.** that no oth
1f890 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  er processes are
1f8a0 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72   able to read or
1f8b0 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
1f8c0 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74  ase.  In.** that
1f8d0 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74   case, we do not
1f8e0 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61   really need sha
1f8f0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20  red memory.  No 
1f900 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  shared memory.**
1f910 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1f920 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  .  The shared me
1f930 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d  mory will be sim
1f940 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70  ulated with heap
1f950 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
1f960 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53  ic int unixOpenS
1f970 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78  haredMemory(unix
1f980 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20  File *pDbFd){.  
1f990 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a  struct unixShm *
1f9a0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1f9b0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1f9c0 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
1f9d0 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  /.  struct unixS
1f9e0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1f9f0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1fa00 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
1fa10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1fa40 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78  t code */.  unix
1fa50 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1fa60 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1fa70 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a  he inode of fd *
1fa80 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69  /.  char *zShmFi
1fa90 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1faa0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1fab0 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  he file used for
1fac0 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   SHM */.  int nS
1fad0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
1fae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1faf0 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c  e of the SHM fil
1fb00 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  ename in bytes *
1fb10 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
1fb20 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
1fb30 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ew unixShm objec
1fb40 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  t. */.  p = sqli
1fb50 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1fb60 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
1fb70 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1fb80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
1fb90 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
1fba0 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74  f(*p));.  assert
1fbb0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
1fbc0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
1fbd0 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
1fbe0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
1fbf0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52  lready exists. R
1fc00 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
1fc10 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65  .  ** one if pre
1fc20 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e  sent. Create a n
1fc30 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
1fc40 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  ary..  */.  unix
1fc50 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1fc60 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
1fc70 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f  pInode;.  pShmNo
1fc80 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  de = pInode->pSh
1fc90 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
1fca0 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
1fcb0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
1fcc0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1fcd0 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e     /* fstat() in
1fce0 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  fo for database 
1fcf0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
1fd00 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  Call fstat() to 
1fd10 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70  figure out the p
1fd20 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
1fd30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fd40 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77   If.    ** a new
1fd50 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63   *-shm file is c
1fd60 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d  reated, an attem
1fd70 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  pt will be made 
1fd80 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20  to create it.   
1fd90 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d   ** with the sam
1fda0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20  e permissions.. 
1fdb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73     */.    if( os
1fdc0 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20  Fstat(pDbFd->h, 
1fdd0 26 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64  &sStat) && pInod
1fde0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
1fdf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1fe00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1fe10 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  TAT;.      goto 
1fe20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1fe30 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1fe40 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1fe50 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
1fe60 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54  e = sizeof(SQLIT
1fe70 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29  E_SHM_DIRECTORY)
1fe80 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20   + 31;.#else.   
1fe90 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
1fea0 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  6 + (int)strlen(
1feb0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23  pDbFd->zPath);.#
1fec0 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
1fed0 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
1fee0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  loc( sizeof(*pSh
1fef0 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c  mNode) + nShmFil
1ff00 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28  ename );.    if(
1ff10 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
1ff20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ff30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1ff40 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1ff50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
1ff60 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20  et(pShmNode, 0, 
1ff70 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
1ff80 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  )+nShmFilename);
1ff90 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  .    zShmFilenam
1ffa0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  e = pShmNode->zF
1ffb0 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
1ffc0 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23  )&pShmNode[1];.#
1ffd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
1ffe0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73  _DIRECTORY.    s
1fff0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
20000 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
20010 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20  hmFilename, .   
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
20040 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
20050 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
20080 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
20090 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
200a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
200b0 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
200c0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22   zShmFilename, "
200d0 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
200e0 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  zPath);.    sqli
200f0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
20100 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68  DbFd->zPath, zSh
20110 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  mFilename);.#end
20120 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
20130 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
20140 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
20150 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
20160 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
20170 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
20180 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
20190 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
201a0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
201b0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
201c0 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
201d0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
201e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
201f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
20200 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
20210 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
20220 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
20230 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
20240 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61       int openFla
20250 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
20260 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28  CREAT;.      if(
20270 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
20280 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  lean(pDbFd->zPat
20290 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
202a0 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
202b0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
202c0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70  DONLY;.        p
202d0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
202e0 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
202f0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
20300 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
20310 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f  (zShmFilename, o
20320 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74  penFlags, (sStat
20330 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
20340 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
20350 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
20360 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
20370 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
20380 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
20390 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
203a0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
203b0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
203c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
203d0 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
203e0 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
203f0 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ot, make sure th
20400 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a  at the SHM file.
20410 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65        ** is owne
20420 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73  d by the same us
20430 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65  er that owns the
20440 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
20450 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  se.  Otherwise,.
20460 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
20470 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c  ginal owner will
20480 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
20490 63 6f 6e 6e 65 63 74 2e 20 49 66 20 74 68 69 73  connect. If this
204a0 20 70 72 6f 63 65 73 73 20 69 73 0a 20 20 20 20   process is.    
204b0 20 20 2a 2a 20 6e 6f 74 20 72 6f 6f 74 2c 20 74    ** not root, t
204c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 63 68  he following fch
204d0 6f 77 6e 28 29 20 77 69 6c 6c 20 66 61 69 6c 2c  own() will fail,
204e0 20 62 75 74 20 77 65 20 64 6f 6e 27 74 20 63 61   but we don't ca
204f0 72 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  re.  The.      *
20500 2a 20 69 66 28 29 7b 2e 2e 7d 20 61 6e 64 20 74  * if(){..} and t
20510 68 65 20 55 4e 49 58 46 49 4c 45 5f 43 48 4f 57  he UNIXFILE_CHOW
20520 4e 20 66 6c 61 67 20 61 72 65 20 70 75 72 65 6c  N flag are purel
20530 79 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  y to silence com
20540 70 69 6c 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  piler.      ** w
20550 61 72 6e 69 6e 67 73 2e 0a 20 20 20 20 20 20 2a  arnings..      *
20560 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 63  /.      if( osFc
20570 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
20580 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
20590 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3d 3d 30  sStat.st_gid)==0
205a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 46   ){.        pDbF
205b0 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  d->ctrlFlags |= 
205c0 55 4e 49 58 46 49 4c 45 5f 43 48 4f 57 4e 3b 0a  UNIXFILE_CHOWN;.
205d0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
205e0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
205f0 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
20600 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
20610 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
20620 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ch..      ** If 
20630 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
20640 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
20650 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f  ength. .      */
20660 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
20670 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
20680 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
20690 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
206a0 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  RLCK, UNIX_SHM_D
206b0 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
206c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
206d0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
206e0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30  e(pShmNode->h, 0
206f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
20700 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
20710 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
20720 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74  MOPEN, "ftruncat
20730 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  e", zShmFilename
20740 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20750 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
20760 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20770 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
20780 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
20790 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
207a0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
207b0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
207c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
207d0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
207e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
207f0 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
20800 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
20810 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
20820 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
20830 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
20840 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20850 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
20860 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
20870 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
20880 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
20890 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
208a0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
208b0 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
208c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
208d0 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
208e0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
208f0 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
20900 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
20910 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
20920 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
20930 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
20940 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
20950 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62  ruct unixShm) ob
20960 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
20970 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
20980 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
20990 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
209a0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
209b0 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
209c0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
209d0 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
209e0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
209f0 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
20a00 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
20a10 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
20a20 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78  utex .  ** mutex
20a30 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
20a40 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
20a50 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
20a60 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
20a70 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
20a80 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
20a90 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
20aa0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
20ab0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
20ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20ad0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
20ae0 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
20af0 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
20b00 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
20b10 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20  DbFd);       /* 
20b20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
20b30 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
20b40 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
20b50 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69  3_free(p);.  uni
20b60 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
20b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20b80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20b90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
20ba0 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
20bb0 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
20bc0 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
20bd0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
20be0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
20bf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
20c00 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
20c10 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
20c20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
20c30 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
20c40 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
20c50 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
20c60 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
20c70 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
20c80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
20c90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
20ca0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
20cb0 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
20cc0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
20cd0 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e  e, if the bExten
20ce0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
20cf0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
20d00 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
20d10 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
20d20 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
20d30 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
20d40 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
20d50 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
20d60 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
20d70 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
20d80 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
20d90 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
20da0 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e  d. If .** bExten
20db0 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  d is non-zero an
20dc0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
20dd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20de0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
20df0 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
20e00 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
20e10 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
20e20 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
20e30 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
20e40 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
20e50 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
20e60 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
20e70 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
20e80 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
20e90 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
20ea0 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
20eb0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
20ec0 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
20ed0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
20ee0 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
20ef0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
20f00 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
20f10 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
20f20 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
20f30 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
20f40 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
20f50 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
20f60 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
20f70 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
20f80 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
20f90 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fb0 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
20fc0 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
20fd0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
20fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20ff0 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
21000 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20   int bExtend,   
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
21030 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
21040 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
21050 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
21060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
21070 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
21080 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
21090 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
210a0 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53  ile*)fd;.  unixS
210b0 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d  hm *p;.  unixShm
210c0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
210d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
210e0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  E_OK;..  /* If t
210f0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
21100 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
21110 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
21120 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
21130 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d   if( pDbFd->pShm
21140 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
21150 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
21160 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
21170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21180 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
21190 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64    }..  p = pDbFd
211a0 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f  ->pShm;.  pShmNo
211b0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
211c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
211d0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
211e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
211f0 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
21200 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
21210 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
21220 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
21230 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
21240 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
21250 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
21260 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
21270 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
21280 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
21290 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
212a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
212b0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
212c0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
212d0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
212e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
212f0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61  egion ){.    cha
21300 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  r **apNew;      
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b  /* New apRegion[
21330 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
21340 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
21350 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
21360 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
21370 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
21380 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
21390 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
213a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
213b0 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a  d by fstat() */.
213c0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
213d0 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
213e0 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  on;..    if( pSh
213f0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
21400 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
21410 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
21420 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
21430 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
21440 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
21450 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
21460 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
21470 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
21480 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
21490 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
214a0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
214b0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
214c0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
214d0 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  n)..      */.   
214e0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
214f0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74  ShmNode->h, &sSt
21500 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  at) ){.        r
21510 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
21520 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20  _SHMSIZE;.      
21530 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
21540 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  ut;.      }.  . 
21550 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73       if( sStat.s
21560 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a  t_size<nByte ){.
21570 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
21580 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
21590 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
215a0 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e  exist. If bExten
215b0 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  d is set to.    
215c0 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78      ** false, ex
215d0 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
215e0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
215f0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
21600 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
21610 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
21620 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
21630 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75  f bExtend is tru
21640 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  e, use ftruncate
21650 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
21660 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
21670 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
21680 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  egion..        *
21690 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62  /.        if( !b
216a0 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68  Extend ) goto sh
216b0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
216c0 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
216d0 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
216e0 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
216f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
21700 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
21710 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
21720 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20   "ftruncate",.  
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
21750 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
21760 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
21770 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
21780 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21790 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
217a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
217b0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
217c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
217d0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
217e0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
217f0 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
21800 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
21810 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
21820 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
21830 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
21840 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
21850 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
21860 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
21870 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
21880 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
21890 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
218a0 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
218b0 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70  New;.    while(p
218c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
218d0 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20  <=iRegion){.    
218e0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
218f0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
21900 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
21910 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c    pMem = mmap(0,
21920 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20   szRegion,.     
21930 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
21940 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
21950 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
21960 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
21970 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
21980 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
21990 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  e->h, pShmNode->
219a0 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
219b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
219c0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
219d0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
219e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
219f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
21a00 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
21a10 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
21a20 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
21a30 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
21a40 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
21a50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21a60 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
21a70 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65  ite3_malloc(szRe
21a80 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
21a90 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
21aa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21ab0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21ac0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
21ad0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
21ae0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
21af0 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f  pMem, 0, szRegio
21b00 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
21b10 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
21b20 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
21b30 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a  Region] = pMem;.
21b40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21b50 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
21b60 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
21b70 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
21b80 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
21b90 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  on ){.    *pp = 
21ba0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
21bb0 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d  on[iRegion];.  }
21bc0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
21bd0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  0;.  }.  if( pSh
21be0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
21bf0 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  y && rc==SQLITE_
21c00 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
21c10 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c  _READONLY;.  sql
21c20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
21c30 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
21c40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21c50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
21c60 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
21c70 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
21c80 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  ry segment..**.*
21c90 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
21ca0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
21cb0 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20  ween SHAREd and 
21cc0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
21cd0 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64  is a little.** d
21ce0 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68  ifferent here th
21cf0 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e  an in posix.  In
21d00 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65   xShmLock(), one
21d10 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c   can go from unl
21d20 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72  ocked.** to shar
21d30 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66  ed and back or f
21d40 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
21d50 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61  exclusive and ba
21d60 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79  ck.  But one may
21d70 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20  .** not go from 
21d80 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73  shared to exclus
21d90 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c  ive or from excl
21da0 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e  usive to shared.
21db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21dc0 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  nixShmLock(.  sq
21dd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
21de0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
21df0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
21e00 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
21e10 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
21e20 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21e30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
21e40 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
21e50 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
21e60 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
21e70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21e80 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
21e90 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
21ea0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
21ed0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
21ee0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
21ef0 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
21f00 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f  *)fd;      /* Co
21f10 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
21f20 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
21f30 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  /.  unixShm *p =
21f40 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
21f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21f60 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
21f70 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
21f80 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20   unixShm *pX;   
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
21fb0 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
21fc0 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69  iblings */.  uni
21fd0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
21fe0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
21ff0 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  ;  /* The underl
22000 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20  ying file iNode 
22010 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
22020 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
22030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22040 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
22050 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22080 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
22090 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
220a0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
220b0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
220c0 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
220d0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
220e0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
220f0 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
22100 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
22110 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
22120 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
22130 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
22140 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
22150 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
22160 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
22170 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
22180 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
22190 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
221a0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
221b0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
221c0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
221d0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
221e0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
221f0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
22200 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
22210 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
22220 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
22230 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
22240 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
22250 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73  SIVE)!=0 );.  as
22260 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
22270 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  h>=0 || pDbFd->p
22280 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
22290 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
222a0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  rt( pShmNode->h<
222b0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
222c0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
222d0 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  ==0 );..  mask =
222e0 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
222f0 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73   (1<<ofst);.  as
22300 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
22310 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
22320 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22330 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
22340 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
22350 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
22360 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
22370 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
22380 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
22390 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
223a0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
223b0 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
223c0 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
223d0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
223e0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
223f0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
22400 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
22410 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
22420 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
22430 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
22440 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
22450 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
22460 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
22470 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
22480 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
22490 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
224a0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
224b0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
224c0 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
224d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
224e0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
224f0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c  (pShmNode, F_UNL
22500 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
22510 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
22520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
22530 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22540 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
22550 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
22560 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
22570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22580 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
22590 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
225a0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
225b0 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
225c0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
225d0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
225e0 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
225f0 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
22600 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
22610 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
22620 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
22630 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
22640 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
22650 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
22660 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
22670 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
22680 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
22690 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
226a0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
226b0 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
226c0 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
226d0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
226e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
226f0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
22700 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
22710 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
22720 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
22730 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
22740 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22750 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
22760 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
22770 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
22780 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
22790 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
227a0 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
227b0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
227c0 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
227d0 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
227e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
227f0 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
22800 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
22810 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22820 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
22830 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
22840 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
22850 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
22860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
22880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22890 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
228a0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
228b0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
228c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
228d0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
228e0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
228f0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
22900 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
22910 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
22920 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
22930 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
22940 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
22950 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
22960 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
22970 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
22980 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
22990 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
229a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
229b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
229c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
229d0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
229e0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
229f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
22a00 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
22a10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
22a30 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
22a40 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
22a50 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
22a60 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
22a70 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
22a80 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
22a90 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
22aa0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
22ab0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
22ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22ad0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
22ae0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
22af0 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  Node, F_WRLCK, o
22b00 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
22b10 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
22b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22b30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
22b40 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
22b50 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
22b60 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
22b70 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
22b80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22b90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
22ba0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
22bb0 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
22bc0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
22bd0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
22be0 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
22bf0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
22c00 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61  getpid(), p->sha
22c10 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
22c20 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
22c30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
22c40 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
22c50 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
22c60 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
22c70 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
22c80 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
22c90 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
22ca0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
22cb0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
22cc0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
22cd0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
22ce0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
22cf0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
22d00 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
22d10 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
22d20 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
22d30 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
22d40 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
22d50 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
22d60 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
22d70 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
22d80 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
22d90 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
22da0 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
22db0 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
22dc0 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
22dd0 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
22de0 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
22df0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
22e00 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
22e10 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
22e20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
22e30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22e40 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
22e50 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
22e60 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
22e70 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
22e80 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
22e90 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
22ea0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
22eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
22ec0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
22ed0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
22ee0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f00 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
22f10 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
22f20 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
22f50 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
22f60 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
22f70 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
22f80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22f90 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
22fa0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
22fb0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
22fe0 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
22ff0 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
23000 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
23030 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
23040 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
23050 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
23060 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
23070 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
23080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23090 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
230a0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
230b0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
230c0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
230d0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
230e0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
230f0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
23100 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
23110 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
23120 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
23130 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
23140 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
23150 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
23160 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23170 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23180 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
23190 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
231a0 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
231b0 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
231c0 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
231d0 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
231e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
231f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
23200 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
23210 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
23220 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
23230 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23240 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
23250 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
23260 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
23270 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
23280 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
23290 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
232a0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
232b0 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
232c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
232d0 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
232e0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
232f0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
23300 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
23310 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65  Flag && pShmNode
23320 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e  ->h>=0 ) osUnlin
23330 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  k(pShmNode->zFil
23340 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78  ename);.    unix
23350 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
23360 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
23370 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
23380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23390 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
233a0 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20   unixShmMap     
233b0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
233c0 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
233d0 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72  fine unixShmBarr
233e0 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ier 0.# define u
233f0 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  nixShmUnmap   0.
23400 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
23410 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
23420 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  L */../*.** Here
23430 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
23440 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
23450 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
23460 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
23470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
23480 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
23490 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
234a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
234c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23500 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
23510 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
23520 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
23530 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
23540 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
23550 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
23560 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
23570 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
23580 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
23590 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
235a0 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
235b0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
235c0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
235d0 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
235e0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
235f0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
23600 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
23610 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
23620 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
23630 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
23640 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
23650 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
23660 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
23670 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
23680 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
23690 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
236a0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
236b0 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
236c0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
236d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
236e0 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
236f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
23700 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
23710 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
23720 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
23730 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
23740 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
23750 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
23760 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
23770 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
23780 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
23790 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
237a0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
237b0 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
237c0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
237d0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
237e0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
237f0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
23800 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
23810 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
23820 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
23830 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
23840 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
23850 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
23860 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
23870 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
23880 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
23890 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
238a0 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
238b0 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
238c0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
238d0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
238e0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
238f0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
23900 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
23910 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
23920 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
23930 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
23940 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
23950 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
23960 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
23970 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
23980 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
23990 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
239a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
239b0 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
239c0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
239d0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
239e0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
239f0 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
23a00 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
23a10 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
23a20 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
23a30 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
23a40 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
23a50 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
23a60 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
23a70 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
23a80 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
23a90 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
23aa0 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49  R, METHOD, VERSI
23ab0 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ON, CLOSE, LOCK,
23ac0 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
23ad0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
23ae0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
23af0 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
23b00 20 7b 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 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
23b30 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
23b40 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
23b50 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
23ba0 2f 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 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
23bd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23be0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
23c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23c30 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
23c70 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
23c80 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
23c90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cd0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23d00 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
23d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23d50 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d70 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23da0 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23dc0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23de0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23df0 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e10 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23e20 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
23e30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23e40 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
23e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23e60 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
23e90 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
23ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
23eb0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ed0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
23ee0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
23ef0 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
23f00 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
23f10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
23f20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
23f30 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  xShmMap,        
23f40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
23f50 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
23f80 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
23f90 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
23fa0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
23fd0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
23fe0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
23ff0 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
24020 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20  mUnmap          
24030 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
24040 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
240c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
240d0 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
240e0 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
240f0 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
24100 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
24110 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
24120 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
24160 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
241f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
24200 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
24210 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
24220 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
24230 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
24240 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
24250 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
24260 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
24270 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24280 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
24290 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
242a0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
242b0 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
242c0 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
242d0 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
242e0 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
242f0 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
24300 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
24310 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
24320 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
24330 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
24340 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
24350 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
24360 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
24370 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32  ject name */.  2
24380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24390 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
243a0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61  ed memory is ena
243b0 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
243c0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
243d0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
243e0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
243f0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24400 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
24410 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
24420 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24430 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
24440 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
24450 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
24460 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
24470 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
24480 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
24490 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
244a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
244b0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
244c0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
244d0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
244e0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
244f0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
24500 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
24530 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
24540 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f  d */.  nolockClo
24550 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
24560 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
24570 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63  d */.  nolockLoc
24580 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24590 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
245a0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f   */.  nolockUnlo
245b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
245c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
245d0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65  d */.  nolockChe
245e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
245f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
24600 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
24610 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
24620 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
24630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
24640 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
24650 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
24660 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
24670 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
24680 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
24690 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
246a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246b0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
246c0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
246d0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
246e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
246f0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
24700 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24720 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
24730 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
24740 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24750 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
24760 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
24770 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a  ReservedLock  /*
24780 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
24790 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
247a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
247b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
247c0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
247d0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
247e0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
247f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
24800 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
24810 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
24820 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
24830 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24840 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
24850 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24870 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
24880 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
24890 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
248a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
248b0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
248c0 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
248d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
248e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
248f0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
24900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
24910 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
24920 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
24930 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
24940 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
24950 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
24960 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
24970 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
24980 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
24990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
249a0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
249b0 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
249c0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
249d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
249e0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
249f0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a10 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
24a20 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
24a30 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20  */.  semClose,  
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a50 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
24a60 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20  */.  semLock,   
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a80 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
24a90 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20  /.  semUnlock,  
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ab0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
24ac0 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73  */.  semCheckRes
24ad0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
24ae0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
24af0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
24b00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
24b10 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
24b20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
24b30 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
24b40 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
24b50 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
24b60 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
24b70 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
24b80 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ba0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24bb0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
24bc0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24be0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
24bf0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
24c00 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
24c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
24c20 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
24c30 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
24c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
24c50 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
24c60 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
24c70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
24c80 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
24c90 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
24ca0 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
24cb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
24cc0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
24cd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
24ce0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
24cf0 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
24d00 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
24d10 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
24d20 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
24d30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
24d40 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
24d50 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
24d60 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
24d70 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
24d80 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
24d90 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
24da0 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
24db0 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
24dc0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
24dd0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
24de0 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
24df0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
24e00 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
24e10 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
24e20 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
24e30 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
24e40 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
24e50 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24e60 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
24e70 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
24e80 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
24e90 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
24ea0 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
24eb0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
24ec0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
24ed0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
24ee0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
24ef0 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
24f00 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
24f10 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
24f20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
24f30 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
24f40 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
24f50 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
24f60 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
24f70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
24f80 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
24f90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
24fa0 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
24fb0 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
24fc0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
24fd0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
24fe0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
24ff0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
25000 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
25010 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
25020 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
25030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25040 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
25050 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
25060 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f  ed */.  proxyClo
25070 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25080 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
25090 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  od */.  proxyLoc
250a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
250b0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
250c0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f  d */.  proxyUnlo
250d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
250e0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
250f0 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65  od */.  proxyChe
25100 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
25110 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
25120 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
25130 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
25140 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
25150 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
25160 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
25170 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
25180 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
25190 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
251a0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
251b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
251c0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
251d0 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
251e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
251f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
25200 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
25210 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
25220 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
25230 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
25240 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
25270 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
25280 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
252b0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252d0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
252e0 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
25310 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
25320 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
25330 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
25340 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
25350 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
25360 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
25370 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
25380 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
25390 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
253a0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
253b0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
253c0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
253d0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
253e0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
253f0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
25400 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
25410 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
25420 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
25430 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
25440 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
25450 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
25460 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58  is is for MacOSX
25470 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
25480 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25490 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
254a0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
254b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
254c0 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
254d0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
254e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
254f0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
25500 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66         /* open f
25510 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ile object for t
25520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25530 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
25540 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70  const struct Map
25550 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
25560 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
25570 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
25580 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74   /* Filesystem t
25590 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ype name */.    
255a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
255b0 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
255c0 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72  ds;   /* Appropr
255d0 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  iate locking met
255e0 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b  hod */.  } aMap[
255f0 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73  ] = {.    { "hfs
25600 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
25610 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
25620 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  ufs",    &posixI
25630 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
25640 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70  { "afpfs",  &afp
25650 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
25660 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
25670 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
25680 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
25690 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
256a0 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
256b0 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
256c0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
256d0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
256e0 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
256f0 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
25700 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
25710 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
25720 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
25730 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
25740 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
25750 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
25760 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
25770 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
25780 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
25790 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
257a0 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
257b0 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
257c0 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
257d0 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
257e0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
257f0 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
25800 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
25810 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
25820 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
25830 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
25840 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
25850 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
25860 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
25870 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
25880 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
25890 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
258a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
258b0 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
258c0 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
258d0 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
258e0 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
258f0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
25900 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
25910 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
25920 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
25930 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
25940 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
25950 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
25960 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
25970 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
25980 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
25990 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
259a0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
259b0 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
259c0 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
259d0 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
259e0 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
259f0 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
25a00 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
25a10 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
25a20 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20   "nfs")==0 ){.  
25a30 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49      return &nfsI
25a40 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20  oMethods;.    } 
25a50 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74  else {.      ret
25a60 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
25a70 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ods;.    }.  }el
25a80 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
25a90 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
25aa0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
25ab0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
25ac0 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
25ad0 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
25ae0 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
25af0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61  *,unixFile*) = a
25b00 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
25b10 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
25b20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
25b30 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
25b40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
25b50 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57  E */..#if OS_VXW
25b60 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
25b70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
25b80 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
25b90 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
25ba0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
25bb0 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
25bc0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
25bd0 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
25be0 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
25bf0 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
25c00 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
25c10 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
25c20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
25c30 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
25c40 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
25c50 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72  his is for VXWor
25c60 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ks only..*/.stat
25c70 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
25c80 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
25c90 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
25ca0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
25cb0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
25cc0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
25cd0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
25ce0 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
25cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
25d00 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
25d10 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
25d20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
25d30 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
25d40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
25d50 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
25d60 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
25d70 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
25d80 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
25d90 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
25da0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
25db0 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
25dc0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
25dd0 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
25de0 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
25df0 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
25e00 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
25e10 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
25e20 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
25e30 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
25e40 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
25e50 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
25e60 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
25e70 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
25e80 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
25e90 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
25ea0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
25eb0 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
25ec0 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
25ed0 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
25ee0 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
25ef0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
25f00 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
25f10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
25f20 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
25f30 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
25f40 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
25f50 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
25f60 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
25f70 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
25f80 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
25f90 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
25fa0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
25fb0 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
25fc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25fd0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
25fe0 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74  ** An abstract t
25ff0 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65  ype for a pointe
26000 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64  r to a IO method
26010 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
26020 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
26030 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
26040 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
26050 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
26060 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
26070 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
26080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
260a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
260b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
260c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
260d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
260e0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
260f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
26110 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
26120 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
26130 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
26140 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
26150 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
26160 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
26170 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
26180 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
26190 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
261a0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
261b0 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
261c0 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
261d0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
261e0 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
261f0 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
26200 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26220 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
26230 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
26240 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
26250 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
26260 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
26270 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
26280 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
26290 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
262a0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
262b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
262c0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
262d0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
262e0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
262f0 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
26300 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
26310 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
26320 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
26330 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
26340 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
26350 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
26360 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
26370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
26380 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
26390 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
263a0 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
263b0 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
263c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
263d0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
263e0 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
263f0 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
26400 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
26410 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
26420 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
26430 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
26440 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
26450 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
26460 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
26470 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
26480 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
26490 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
264a0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
264b0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
264c0 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
264d0 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
264e0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
264f0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
26500 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
26510 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
26520 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
26530 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
26540 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
26550 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
26560 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
26570 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
26580 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
26590 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
265a0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
265b0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
265c0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
265d0 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
265e0 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
265f0 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
26600 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
26610 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
26620 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 20  (u8)ctrlFlags;. 
26630 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
26640 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46  _boolean(((ctrlF
26650 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
26660 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65  URI) ? zFilename
26670 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20   : 0),.         
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26690 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45    "psow", SQLITE
266a0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
266b0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65  RITE) ){.    pNe
266c0 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
266d0 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20  UNIXFILE_PSOW;. 
266e0 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
266f0 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69  pVfs->zName,"uni
26700 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29  x-excl",10)==0 )
26710 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
26720 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
26730 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66  E_EXCL;.  }..#if
26740 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e   OS_VXWORKS.  pN
26750 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b  ew->pId = vxwork
26760 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c  sFindFileId(zFil
26770 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  ename);.  if( pN
26780 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20  ew->pId==0 ){.  
26790 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
267a0 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
267b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
267c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
267d0 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61  f..  if( ctrlFla
267e0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
267f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  LOCK ){.    pLoc
26800 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
26810 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
26820 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
26830 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
26840 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
26850 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
26860 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
26870 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
26880 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
26890 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
268a0 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
268b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
268c0 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
268d0 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
268e0 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
268f0 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
26900 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
26910 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
26920 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
26930 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
26940 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
26950 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
26960 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
26970 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
26980 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
26990 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
269a0 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
269b0 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
269c0 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
269d0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
269e0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
269f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
26a00 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
26a10 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
26a20 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b  hods.#endif.  ){
26a30 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
26a40 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
26a50 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
26a60 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
26a70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
26a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26a90 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
26aa0 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e  r occured in fin
26ab0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c  dInodeInfo(), cl
26ac0 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
26ad0 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a  criptor.      **
26ae0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65   immediately, be
26af0 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74  fore releasing t
26b00 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e  he mutex. findIn
26b10 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61  odeInfo() may fa
26b20 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  il.      ** in t
26b30 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20  wo scenarios:.  
26b40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
26b50 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20    (a) A call to 
26b60 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a  fstat() failed..
26b70 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41        **   (b) A
26b80 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a   malloc failed..
26b90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
26ba0 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d  * Scenario (b) m
26bb0 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  ay only occur if
26bc0 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20   the process is 
26bd0 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72  holding no other
26be0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64  .      ** file d
26bf0 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20  escriptors open 
26c00 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
26c10 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  . If there were 
26c20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20  other file.     
26c30 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20   ** descriptors 
26c40 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  on this file, th
26c50 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75  en no malloc wou
26c60 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62  ld be required b
26c70 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49  y.      ** findI
26c80 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74  nodeInfo(). If t
26c90 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
26ca0 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66   it is quite saf
26cb0 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20  e to close.     
26cc0 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61   ** handle h - a
26cd0 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
26ce0 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78  ed that no posix
26cf0 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72   locks will be r
26d00 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a  eleased.      **
26d10 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20   by doing so..  
26d20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
26d30 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20  If scenario (a) 
26d40 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
26d50 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65   then things are
26d60 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68   not so safe. Th
26d70 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69  e.      ** impli
26d80 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68  cit assumption h
26d90 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66  ere is that if f
26da0 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68  stat() fails, th
26db0 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20  ings are in.    
26dc0 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68    ** such bad sh
26dd0 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e  ape that droppin
26de0 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20  g a lock or two 
26df0 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d  doesn't matter m
26e00 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uch..      */.  
26e10 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
26e20 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
26e30 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d  __);.      h = -
26e40 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  1;.    }.    uni
26e50 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
26e60 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   }..#if SQLITE_E
26e70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
26e80 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
26e90 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65  _APPLE__).  else
26ea0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
26eb0 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  le == &afpIoMeth
26ec0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46  ods ){.    /* AF
26ed0 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  P locking uses t
26ee0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
26ef0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
26f00 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
26f10 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * the afpLocking
26f20 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a  Context..    */.
26f30 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
26f40 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
26f50 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
26f60 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73  ntext = pCtx = s
26f70 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
26f80 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
26f90 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
26fa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
26fb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
26fd0 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
26fe0 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
26ff0 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
27000 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
27010 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
27020 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
27030 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
27040 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
27050 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
27060 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
27070 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
27080 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
27090 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
270a0 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
270b0 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
270c0 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
270d0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
270e0 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
270f0 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
27100 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
27110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27130 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
27140 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
27150 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  xt);.        rob
27160 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
27170 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
27180 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
27190 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78      }.      unix
271a0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
271b0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
271c0 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
271d0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
271e0 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
271f0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
27200 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
27210 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
27220 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
27230 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
27240 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
27250 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
27260 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
27270 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
27280 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
27290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46  ;.    assert( zF
272a0 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ilename!=0 );.  
272b0 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
272c0 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
272d0 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
272e0 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
272f0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
27300 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
27310 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
27320 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
27330 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
27350 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27360 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
27370 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
27380 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
27390 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
273a0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
273b0 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
273c0 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
273d0 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
273e0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
273f0 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
27400 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
27410 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
27420 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
27430 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
27440 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
27450 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
27460 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
27470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
27480 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
27490 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
274a0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
274b0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
274c0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
274d0 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
274e0 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
274f0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
27500 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
27510 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
27520 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
27530 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
27540 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
27550 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
27560 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
27590 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
275a0 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
275b0 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
275c0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
275d0 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
275e0 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
275f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
27600 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
27610 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
27620 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
27630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
27640 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
27650 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
27660 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27670 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
27680 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
27690 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
276a0 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20  '\0';.      }.  
276b0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
276c0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
276d0 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e  ndif.  .  pNew->
276e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23  lastErrno = 0;.#
276f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
27700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27710 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
27720 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
27730 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
27740 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  __);.    h = -1;
27750 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46  .    osUnlink(zF
27760 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
27770 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
27780 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
27790 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
277a0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
277b0 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ETE;.#endif.  if
277c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
277d0 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
277e0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
277f0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
27800 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27810 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
27820 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
27830 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
27840 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
27850 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
27860 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
27870 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
27880 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
27890 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
278a0 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
278b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
278c0 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
278d0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
278e0 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
278f0 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
27900 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
27910 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
27920 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
27930 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
27940 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
27950 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
27960 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
27970 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20  ,.     0        
27980 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74  /* List terminat
27990 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73  or */.  };.  uns
279a0 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
279b0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
279c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
279d0 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72  ir = 0;..  azDir
279e0 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
279f0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
27a00 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
27a10 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
27a20 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
27a30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
27a40 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
27a50 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
27a60 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
27a70 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  {.    if( zDir==
27a80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
27a90 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69    if( osStat(zDi
27aa0 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  r, &buf) ) conti
27ab0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
27ac0 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
27ad0 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
27ae0 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28     if( osAccess(
27af0 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74  zDir, 07) ) cont
27b00 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b  inue;.    break;
27b10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44  .  }.  return zD
27b20 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ir;.}../*.** Cre
27b30 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
27b40 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
27b50 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
27b60 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
27b70 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
27b80 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
27b90 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
27ba0 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
27bb0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
27bc0 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
27bd0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
27be0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
27bf0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
27c00 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
27c10 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
27c20 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
27c30 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
27c40 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
27c50 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
27c60 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
27c70 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
27c80 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
27c90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
27ca0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
27cb0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
27cc0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
27cd0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
27ce0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
27cf0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
27d00 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
27d10 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
27d20 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
27d30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
27d40 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
27d50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
27d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27d70 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
27d80 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
27d90 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
27da0 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a   ) zDir = ".";..
27db0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
27dc0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
27dd0 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
27de0 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
27df0 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
27e00 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
27e10 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
27e20 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
27e30 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
27e40 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
27e50 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
27e60 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a  X) + 18) >= (siz
27e70 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
27e80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
27e90 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
27ea0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
27eb0 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42  intf(nBuf-18, zB
27ec0 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
27ed0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
27ee0 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
27ef0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
27f00 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
27f10 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
27f20 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
27f30 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
27f40 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
27f50 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
27f60 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
27f70 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
27f80 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
27f90 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
27fa0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[j] = 0;.    
27fb0 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
27fc0 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73   }while( osAcces
27fd0 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
27fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27ff0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
28000 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28010 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
28020 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
28030 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
28040 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
28050 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
28060 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
28070 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
28080 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
28090 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
280a0 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
280b0 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
280c0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
280d0 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
280e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
280f0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
28100 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
28110 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
28120 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
28130 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
28140 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
28150 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
28160 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
28170 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
28180 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
28190 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
281a0 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
281b0 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
281c0 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
281d0 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
281e0 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
281f0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
28200 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
28210 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
28220 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
28230 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
28240 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
28250 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
28260 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
28270 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
28280 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
28290 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
282a0 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
282b0 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
282c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
282d0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
282e0 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
282f0 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
28300 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
28310 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
28320 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
28330 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
28340 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
28350 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
28360 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
28370 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
28380 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
28390 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
283a0 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
283b0 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
283c0 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
283d0 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
283e0 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
283f0 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
28400 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
28410 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
28420 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
28430 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
28440 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
28450 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
28460 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
28470 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
28480 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
28490 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
284a0 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
284b0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
284c0 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
284d0 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
284e0 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
284f0 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
28500 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
28510 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
28520 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
28530 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
28540 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
28550 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
28560 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
28570 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
28580 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
28590 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
285a0 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
285b0 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
285c0 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
285d0 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
285e0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
285f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
28600 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
28610 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
28620 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
28630 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
28640 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
28650 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
28660 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
28670 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
28680 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
28690 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
286a0 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
286b0 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
286c0 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
286d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
286e0 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
286f0 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
28700 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
28710 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
28720 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
28730 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
28740 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
28750 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
28760 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
28770 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
28780 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
28790 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
287a0 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
287b0 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
287c0 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
287d0 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
287e0 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
287f0 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20   resusable file 
28800 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
28810 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
28820 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  f( 0==osStat(zPa
28830 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  th, &sStat) ){. 
28840 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f     unixInodeInfo
28850 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75   *pInode;..    u
28860 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
28870 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  .    pInode = in
28880 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  odeList;.    whi
28890 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70  le( pInode && (p
288a0 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65  Inode->fileId.de
288b0 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e       || pInode->
288e0 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61  fileId.ino!=sSta
288f0 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20  t.st_ino) ){.   
28900 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
28910 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
28920 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  }.    if( pInode
28930 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e   ){.      UnixUn
28940 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20  usedFd **pp;.   
28950 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64     for(pp=&pInod
28960 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20  e->pUnused; *pp 
28970 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21  && (*pp)->flags!
28980 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70  =flags; pp=&((*p
28990 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
289a0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70     pUnused = *pp
289b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75  ;.      if( pUnu
289c0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  sed ){.        *
289d0 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e  pp = pUnused->pN
289e0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
289f0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
28a00 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
28a10 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
28a20 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
28a30 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
28a40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
28a50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
28a60 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20  y unixOpen() to 
28a70 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
28a80 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ix permissions.*
28a90 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  * to create new 
28aa0 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e  files with. If n
28ab0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
28ac0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
28ad0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
28ae0 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62  d a value suitab
28af0 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61  le for passing a
28b00 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
28b10 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20  ment to open(2) 
28b20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
28b30 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49   *pMode. If an I
28b40 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
28b50 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
28b60 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
28b70 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
28b80 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20  ue of *pMode is 
28b90 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  not modified..**
28ba0 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  .** In most case
28bb0 73 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f  s cases, this ro
28bc0 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64  utine sets *pMod
28bd0 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69  e to 0, which wi
28be0 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20  ll become.** an 
28bf0 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f  indication to ro
28c00 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63  bust_open() to c
28c10 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75  reate the file u
28c20 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  sing.** SQLITE_D
28c30 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
28c40 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64  ISSIONS adjusted
28c50 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
28c60 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c  * But if the fil
28c70 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
28c80 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
28c90 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
28ca0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
28cb0 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
28cc0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
28cd0 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
28ce0 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
28cf0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
28d00 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
28d10 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
28d20 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
28d30 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
28d40 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
28d50 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
28d60 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
28d70 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
28d80 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
28d90 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
28da0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
28db0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
28dc0 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
28dd0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
28de0 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
28df0 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
28e00 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
28e10 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
28e20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
28e30 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
28e40 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
28e50 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
28e60 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
28e70 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
28e80 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
28e90 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
28ea0 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
28eb0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ed0 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
28ee0 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
28ef0 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
28f00 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
28f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
28f20 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
28f30 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
28f40 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
28f50 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
28f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28f70 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
28f80 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
28f90 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
28fa0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
28fb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
28fc0 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
28fd0 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
28fe0 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
28ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
29000 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
29010 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
29020 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29030 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
29040 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
29050 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b  */.  *pMode = 0;
29060 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20  .  *pUid = 0;.  
29070 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  *pGid = 0;.  if(
29080 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
29090 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
290a0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
290b0 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  AL) ){.    char 
290c0 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  zDb[MAX_PATHNAME
290d0 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  +1];     /* Data
290e0 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a  base file path *
290f0 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20  /.    int nDb;  
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29120 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
29130 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  zDb */.    struc
29140 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
29150 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
29160 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20  ut of stat() on 
29170 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29180 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69  ..    /* zPath i
29190 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41  s a path to a WA
291a0 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  L or journal fil
291b0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
291c0 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20   block derives. 
291d0 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74     ** the path t
291e0 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
291f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
29200 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20  rom zPath. This 
29210 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20  block handles.  
29220 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
29230 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e  ng naming conven
29240 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  tions:.    **.  
29250 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
29260 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20   db>-journal".  
29270 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
29280 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a   db>-wal".    **
29290 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
292a0 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20  -journalNN".    
292b0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
292c0 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  b>-walNN".    **
292d0 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e  .    ** where NN
292e0 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75   is a decimal nu
292f0 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d  mber. The NN nam
29300 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20  ing schemes are 
29310 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20  .    ** used by 
29320 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c  the test_multipl
29330 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20  ex.c module..   
29340 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71   */.    nDb = sq
29350 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
29360 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65  ath) - 1; .#ifde
29370 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29380 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68  8_3_NAMES.    wh
29390 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71  ile( nDb>0 && sq
293a0 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61  lite3Isalnum(zPa
293b0 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d  th[nDb]) ) nDb--
293c0 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30  ;.    if( nDb==0
293d0 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d   || zPath[nDb]!=
293e0 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c  '-' ) return SQL
293f0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
29400 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e    while( zPath[n
29410 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  Db]!='-' ){.    
29420 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20    assert( nDb>0 
29430 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29440 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e   zPath[nDb]!='\n
29450 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d  ' );.      nDb--
29460 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
29470 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a     memcpy(zDb, z
29480 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20  Path, nDb);.    
29490 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b  zDb[nDb] = '\0';
294a0 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ..    if( 0==osS
294b0 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29  tat(zDb, &sStat)
294c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65   ){.      *pMode
294d0 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65   = sStat.st_mode
294e0 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a   & 0777;.      *
294f0 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pUid = sStat.st_
29500 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64  uid;.      *pGid
29510 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b   = sStat.st_gid;
29520 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
29540 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
29550 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
29560 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
29570 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
29580 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
29590 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  600;.  }.  retur
295a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
295b0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
295c0 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
295d0 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
295e0 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
295f0 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
29600 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
29610 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
29620 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
29630 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
29640 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
29650 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
29660 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
29670 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
29680 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
29690 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
296a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
296b0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
296c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
296d0 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
296e0 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
296f0 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
29700 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
29710 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
29720 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
29730 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
29740 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
29750 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
29760 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
29770 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
29780 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
29790 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
297a0 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
297b0 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
297c0 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
297d0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
297e0 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
297f0 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
29800 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
29810 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
29820 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
29830 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
29840 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
29850 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
29860 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
29870 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
29880 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
29890 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
298a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
298b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
298c0 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
298d0 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
298e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
298f0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
29900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
29910 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
29920 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
29930 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
29940 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
29950 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
29960 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
29970 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
29980 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
29990 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
299a0 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
299b0 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
299c0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
299e0 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
299f0 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
29a00 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
29a10 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
29a20 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
29a30 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a50 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
29a60 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
29a70 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  pen() */.  int o
29a80 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
29a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
29aa0 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
29ab0 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54  en() */.  int eT
29ac0 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
29ad0 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
29ae0 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
29af0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
29b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29b10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
29b20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
29b30 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
29b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29b60 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
29b70 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ode */.  int ctr
29b80 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  lFlags = 0;     
29b90 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46          /* UNIXF
29ba0 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a  ILE_* flags */..
29bb0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
29bc0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
29bd0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
29be0 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
29bf0 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
29c00 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
29c10 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
29c20 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
29c30 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
29c40 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
29c50 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
29c60 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
29c70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
29c80 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
29c90 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
29ca0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
29cb0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
29cc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29cd0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
29ce0 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
29cf0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
29d00 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
29d10 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
29d20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29d30 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
29d40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29d50 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
29d60 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
29d70 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
29d80 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
29d90 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
29da0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
29db0 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
29dc0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
29dd0 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
29de0 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
29df0 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
29e00 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
29e10 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
29e20 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
29e30 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
29e40 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
29e50 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
29e60 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
29e70 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
29e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
29e90 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
29ea0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
29eb0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
29ec0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
29ed0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
29ee0 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
29ef0 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
29f00 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
29f10 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
29f20 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
29f30 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
29f40 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
29f50 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
29f60 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
29f70 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
29f80 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
29f90 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20  X_PATHNAME+2];. 
29fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
29fb0 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
29fc0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
29fd0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
29fe0 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
29ff0 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
2a000 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
2a010 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
2a020 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
2a030 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
2a040 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
2a050 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
2a060 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
2a070 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
2a080 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
2a090 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
2a0a0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
2a0b0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
2a0c0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
2a0d0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
2a0e0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
2a0f0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
2a100 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
2a110 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
2a120 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
2a130 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
2a140 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
2a150 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
2a160 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
2a170 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
2a180 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
2a190 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
2a1a0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
2a1b0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
2a1c0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
2a1d0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
2a1e0 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
2a1f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
2a200 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
2a210 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
2a220 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
2a230 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
2a240 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
2a250 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
2a260 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
2a270 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
2a280 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
2a290 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
2a2a0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
2a2b0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
2a2c0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
2a2d0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2a2e0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2a2f0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2a300 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
2a310 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
2a320 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2a330 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2a340 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
2a350 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
2a360 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
2a370 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
2a380 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
2a390 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
2a3a0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
2a3b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2a3c0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
2a3d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
2a3e0 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
2a3f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2a400 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2a410 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2a420 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
2a430 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
2a440 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2a450 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
2a460 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2a470 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
2a480 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
2a490 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2a4a0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
2a4b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2a4c0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
2a4d0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
2a4e0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2a4f0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
2a500 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2a510 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
2a520 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
2a530 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
2a540 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
2a550 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
2a560 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2a570 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
2a580 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
2a590 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
2a5a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2a5b0 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2a5c0 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  d));.      if( !
2a5d0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2a5e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a5f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
2a600 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e      }.    p->pUn
2a610 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
2a620 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  .    /* Database
2a630 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
2a640 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
2a650 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
2a660 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49  e not.    ** URI
2a670 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
2a680 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
2a690 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
2a6a0 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ssed into.    **
2a6b0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
2a6c0 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
2a6d0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
2a6e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
2a6f0 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c  I) || zName[strl
2a700 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2a710 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  );..  }else if( 
2a720 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
2a730 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
2a740 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
2a750 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
2a760 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
2a770 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
2a780 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72  lete && !syncDir
2a790 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  );.    rc = unix
2a7a0 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  GetTempname(MAX_
2a7b0 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70  PATHNAME+2, zTmp
2a7c0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
2a7d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a7e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2a7f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
2a800 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20   = zTmpname;..  
2a810 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74    /* Generated t
2a820 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
2a830 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f  es are always do
2a840 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e  uble-zero termin
2a850 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ated.    ** for 
2a860 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75  use by sqlite3_u
2a870 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
2a880 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
2a890 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d  Name[strlen(zNam
2a8a0 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a  e)+1]==0 );.  }.
2a8b0 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
2a8c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2a8d0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2a8e0 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
2a8f0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
2a900 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
2a910 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
2a920 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
2a930 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
2a940 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
2a950 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
2a960 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
2a970 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
2a980 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
2a990 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
2a9a0 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
2a9b0 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
2a9c0 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
2a9d0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
2a9e0 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
2a9f0 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
2aa00 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
2aa10 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
2aa20 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
2aa30 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
2aa40 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
2aa50 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
2aa60 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
2aa70 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
2aa80 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
2aa90 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
2aaa0 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
2aab0 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
2aac0 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e     /* Permission
2aad0 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65  s to create file
2aae0 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64   with */.    uid
2aaf0 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20  _t uid;         
2ab00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2ab10 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  erid for the fil
2ab20 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67  e */.    gid_t g
2ab30 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2ab40 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69         /* Groupi
2ab50 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
2ab60 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43  /.    rc = findC
2ab70 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
2ab80 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65  ame, flags, &ope
2ab90 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69  nMode, &uid, &gi
2aba0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
2abb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2abc0 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70     assert( !p->p
2abd0 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20  Unused );.      
2abe0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
2abf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
2ac00 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2ac10 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2ac20 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L );.      retur
2ac30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2ac40 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2ac50 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
2ac60 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
2ac70 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
2ac80 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
2ac90 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
2aca0 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
2acb0 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
2acc0 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
2acd0 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
2ace0 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
2acf0 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
2ad00 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
2ad10 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2ad20 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
2ad30 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67  y. */.      flag
2ad40 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
2ad50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2ad60 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2ad70 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
2ad80 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f  s &= ~(O_RDWR|O_
2ad90 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c  CREAT);.      fl
2ada0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2adb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2adc0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
2add0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
2ade0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
2adf0 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
2ae00 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
2ae10 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
2ae20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2ae30 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
2ae40 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2ae50 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2ae60 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
2ae70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
2ae80 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
2ae90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2aea0 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
2aeb0 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
2aec0 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74 69  ot and if creati
2aed0 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63  ng a new rollbac
2aee0 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  k.    ** journal
2aef0 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65   or WAL file, se
2af00 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20  t the ownership 
2af10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  of the journal o
2af20 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20  r WAL to be.    
2af30 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
2af40 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
2af50 62 61 73 65 2e 20 20 49 66 20 77 65 20 61 72 65  base.  If we are
2af60 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20   not running as 
2af70 72 6f 6f 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  root,.    ** the
2af80 6e 20 74 68 65 20 66 63 68 6f 77 6e 28 29 20 63  n the fchown() c
2af90 61 6c 6c 20 77 69 6c 6c 20 66 61 69 6c 2c 20 62  all will fail, b
2afa0 75 74 20 74 68 61 74 27 73 20 6f 6b 2e 20 20 54  ut that's ok.  T
2afb0 68 65 20 22 69 66 28 29 7b 7d 22 20 61 6e 64 0a  he "if(){}" and.
2afc0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 74 74 69      ** the setti
2afd0 6e 67 20 6f 66 20 74 68 65 20 55 4e 49 58 46 49  ng of the UNIXFI
2afe0 4c 45 5f 43 48 4f 57 4e 20 66 6c 61 67 20 61 72  LE_CHOWN flag ar
2aff0 65 20 70 75 72 65 6c 79 20 74 6f 20 73 69 6c 65  e purely to sile
2b000 6e 63 65 20 63 6f 6d 70 69 6c 65 72 0a 20 20 20  nce compiler.   
2b010 20 2a 2a 20 77 61 72 6e 69 6e 67 73 20 66 72 6f   ** warnings fro
2b020 6d 20 67 63 63 2e 0a 20 20 20 20 2a 2f 0a 20 20  m gcc..    */.  
2b030 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2b040 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2b050 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2b060 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2b070 20 20 69 66 28 20 6f 73 46 63 68 6f 77 6e 28 66    if( osFchown(f
2b080 64 2c 20 75 69 64 2c 20 67 69 64 29 3d 3d 30 20  d, uid, gid)==0 
2b090 29 7b 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20  ){ p->ctrlFlags 
2b0a0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 43 48 4f 57  |= UNIXFILE_CHOW
2b0b0 4e 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  N; }.    }.  }. 
2b0c0 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29   assert( fd>=0 )
2b0d0 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ;.  if( pOutFlag
2b0e0 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
2b0f0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
2b100 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73  ..  if( p->pUnus
2b110 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e  ed ){.    p->pUn
2b120 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
2b130 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
2b140 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
2b150 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  }..  if( isDelet
2b160 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  e ){.#if OS_VXWO
2b170 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  RKS.    zPath = 
2b180 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20  zName;.#else.   
2b190 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29   osUnlink(zName)
2b1a0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
2b1b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b1c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65  OCKING_STYLE.  e
2b1d0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e  lse{.    p->open
2b1e0 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  Flags = openFlag
2b1f0 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  s;.  }.#endif..#
2b200 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
2b210 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  .  osFcntl(fd, F
2b220 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
2b230 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
2b240 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
2b250 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
2b260 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
2b270 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
2b280 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
2b290 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
2b2a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b2b0 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73  G_STYLE.  if( fs
2b2c0 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
2b2d0 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
2b2e0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
2b2f0 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  e)->lastErrno = 
2b300 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73  errno;.    robus
2b310 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
2b320 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65  _LINE__);.    re
2b330 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2b340 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  R_ACCESS;.  }.  
2b350 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
2b360 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
2b370 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
2b380 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
2b390 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
2b3a0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
2b3b0 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
2b3c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2b3d0 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72  * Set up appropr
2b3e0 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a  iate ctrlFlags *
2b3f0 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  /.  if( isDelete
2b400 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
2b410 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2b420 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a  NIXFILE_DELETE;.
2b430 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
2b440 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
2b450 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2b460 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  XFILE_RDONLY;.  
2b470 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20  if( noLock )    
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
2b490 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2b4a0 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66  ILE_NOLOCK;.  if
2b4b0 28 20 73 79 6e 63 44 69 72 20 29 20 20 20 20 20  ( syncDir )     
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
2b4d0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2b4e0 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28  E_DIRSYNC;.  if(
2b4f0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2b500 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46  OPEN_URI ) ctrlF
2b510 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2b520 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54  _URI;..#if SQLIT
2b530 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b540 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54  _STYLE.#if SQLIT
2b550 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2b560 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50  OCKING.  isAutoP
2b570 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  roxy = 1;.#endif
2b580 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f  .  if( isAutoPro
2b590 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55  xy && (zPath!=NU
2b5a0 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29  LL) && (!noLock)
2b5b0 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20   && pVfs->xOpen 
2b5c0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76  ){.    char *env
2b5d0 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22  force = getenv("
2b5e0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
2b5f0 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20  XY_LOCKING");.  
2b600 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d    int useProxy =
2b610 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49   0;..    /* SQLI
2b620 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2b630 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20  OCKING==1 means 
2b640 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65  force always use
2b650 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20   proxy, 0 means 
2b660 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73  .    ** never us
2b670 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65  e proxy, NULL me
2b680 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f  ans use proxy fo
2b690 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  r non-local file
2b6a0 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20  s only.  */.    
2b6b0 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55  if( envforce!=NU
2b6c0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50  LL ){.      useP
2b6d0 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66  roxy = atoi(envf
2b6e0 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c  orce)>0;.    }el
2b6f0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  se{.      if( st
2b700 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
2b710 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2b720 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
2b730 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64  ry, the close(fd
2b740 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70  ) call is sub-op
2b750 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69  timal. If the fi
2b760 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20  le opened.      
2b770 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20    ** with fd is 
2b780 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2b790 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f   and there are o
2b7a0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
2b7b0 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
2b7c0 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
2b7d0 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
2b7e0 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72   holding advisor
2b7f0 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20  y locks on it,. 
2b800 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
2b810 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65  he call to close
2b820 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74  () will cancel t
2b830 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70  hose locks. In p
2b840 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20  ractice,.       
2b850 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69   ** we're assumi
2b860 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29  ng that statfs()
2b870 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65   doesn't fail ve
2b880 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61  ry often. At lea
2b890 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  st.        ** no
2b8a0 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69  t while other fi
2b8b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2b8c0 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  pened by the sam
2b8d0 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20  e process on.   
2b8e0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
2b8f0 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e   file are workin
2b900 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  g.  */.        p
2b910 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2b920 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  rno;.        rob
2b930 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2b940 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2b950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b960 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
2b970 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
2b980 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
2b990 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
2b9a0 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
2b9b0 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
2b9c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
2b9d0 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
2b9e0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
2b9f0 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
2ba00 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
2ba10 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
2ba20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ba30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2ba40 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2ba50 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
2ba60 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
2ba70 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
2ba80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ba90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  .          /* Us
2baa0 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63  e unixClose to c
2bab0 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f  lean up the reso
2bac0 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66  urces added in f
2bad0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20  illInUnixFile . 
2bae0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2baf0 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74  clear all the st
2bb00 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65  ructure's refere
2bb10 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61  nces.  Specifica
2bb20 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  lly, .          
2bb30 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  ** pFile->pMetho
2bb40 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  ds will be NULL 
2bb50 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  so sqlite3OsClos
2bb60 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f  e will be a no-o
2bb70 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  p .          */.
2bb80 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c            unixCl
2bb90 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
2bba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bbb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bbc0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
2bbd0 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2bbe0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
2bbf0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
2bc00 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
2bc10 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
2bc20 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e  trlFlags);..open
2bc30 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
2bc40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bc50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2bc60 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
2bc70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bc80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
2bc90 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
2bca0 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
2bcb0 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
2bcc0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
2bcd0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
2bce0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
2bcf0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
2bd00 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
2bd10 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2bd20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
2bd30 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
2bd40 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
2bd50 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
2bd60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2bd70 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
2bd80 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2bd90 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
2bda0 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
2bdb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2bdc0 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
2bdd0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
2bde0 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
2bdf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2be00 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
2be10 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2be20 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2be30 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
2be40 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
2be50 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
2be60 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
2be70 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2be80 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
2be90 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2bea0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
2beb0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
2bec0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2bed0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2bee0 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
2bef0 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
2bf00 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
2bf10 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
2bf20 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
2bf30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bf40 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
2bf50 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
2bf60 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
2bf70 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
2bf80 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
2bf90 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
2bfa0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
2bfb0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
2bfc0 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
2bfd0 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
2bfe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
2bff0 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
2c000 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2c010 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2c020 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
2c030 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2c040 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2c050 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2c060 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
2c070 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  st the existance
2c080 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
2c090 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
2c0a0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
2c0b0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
2c0c0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
2c0d0 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
2c0e0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2c0f0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
2c100 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
2c110 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
2c120 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2c130 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
2c140 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
2c150 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
2c160 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
2c170 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
2c180 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
2c190 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
2c1a0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
2c1b0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
2c1c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2c1d0 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
2c1e0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2c1f0 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
2c200 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
2c210 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
2c220 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c230 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
2c240 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
2c250 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
2c260 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2c270 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
2c280 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
2c290 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
2c2a0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
2c2b0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
2c2c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
2c2d0 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
2c2e0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
2c2f0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
2c300 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2c310 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2c320 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2c330 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2c340 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
2c350 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
2c360 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2c370 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
2c380 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
2c390 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c3a0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2c3b0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
2c3c0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
2c3d0 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
2c3e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2c3f0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
2c400 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
2c410 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
2c420 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
2c430 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
2c440 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
2c450 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
2c460 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
2c470 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
2c480 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
2c490 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
2c4a0 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
2c4b0 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
2c4c0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
2c4d0 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2c4e0 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
2c4f0 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
2c500 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
2c510 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2c520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c530 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
2c540 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
2c550 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
2c560 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
2c570 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
2c580 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
2c590 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
2c5a0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
2c5b0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
2c5c0 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
2c5d0 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
2c5e0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
2c5f0 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
2c600 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
2c610 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
2c620 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
2c630 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
2c640 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
2c650 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
2c660 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
2c670 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
2c680 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
2c690 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
2c6a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2c6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2c6c0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
2c6d0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2c6e0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
2c6f0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
2c700 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
2c710 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
2c720 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2c730 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2c740 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
2c750 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
2c760 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c780 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
2c790 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
2c7a0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
2c7b0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
2c7c0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
2c7d0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
2c7e0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
2c7f0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
2c800 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
2c810 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
2c820 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
2c830 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
2c840 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
2c850 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
2c860 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
2c870 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
2c880 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
2c890 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
2c8a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2c8b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2c8c0 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
2c8d0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
2c8e0 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
2c8f0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2c900 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
2c910 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
2c920 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
2c930 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
2c940 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c950 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
2c960 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
2c970 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
2c980 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
2c990 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
2c9a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
2c9b0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
2c9c0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2c9d0 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
2c9e0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
2c9f0 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
2ca00 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
2ca10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2ca20 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
2ca30 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
2ca40 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
2ca50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ca60 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
2ca70 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2ca80 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
2ca90 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
2caa0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
2cab0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
2cac0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
2cad0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
2cae0 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
2caf0 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
2cb00 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
2cb10 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
2cb20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
2cb30 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
2cb40 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
2cb50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2cb60 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
2cb70 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2cb80 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
2cb90 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
2cba0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
2cbb0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
2cbc0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2cbd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
2cbe0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
2cbf0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
2cc00 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
2cc10 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
2cc20 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
2cc30 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
2cc40 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
2cc50 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
2cc60 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
2cc70 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
2cc80 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
2cc90 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
2cca0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
2ccb0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
2ccc0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
2ccd0 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
2cce0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
2ccf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2cd00 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
2cd10 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2cd20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2cd30 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
2cd40 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
2cd50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2cd60 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
2cd70 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2cd80 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
2cd90 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
2cda0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2cdb0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
2cdc0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
2cdd0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
2cde0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
2cdf0 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
2ce00 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
2ce10 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
2ce20 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
2ce30 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
2ce40 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
2ce50 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
2ce60 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
2ce70 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
2ce80 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
2ce90 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
2cea0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2ceb0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
2cec0 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
2ced0 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
2cee0 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
2cef0 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
2cf00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
2cf10 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
2cf20 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
2cf30 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
2cf40 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
2cf50 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
2cf60 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
2cf70 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
2cf80 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2cf90 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
2cfa0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
2cfb0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
2cfc0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
2cfd0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2cfe0 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
2cff0 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
2d000 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
2d010 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
2d020 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
2d030 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
2d040 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
2d050 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
2d060 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
2d070 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
2d080 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
2d090 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
2d0a0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
2d0b0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
2d0c0 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
2d0d0 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
2d0e0 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
2d0f0 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
2d100 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
2d110 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
2d120 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
2d130 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
2d140 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
2d150 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
2d160 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
2d170 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
2d180 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
2d190 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
2d1a0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
2d1b0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
2d1c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2d1d0 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
2d1e0 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
2d1f0 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
2d200 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
2d210 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
2d220 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2d230 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
2d240 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2d250 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
2d260 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d270 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2d280 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
2d290 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2d2a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2d2b0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2d2c0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2d2d0 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
2d2e0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2d2f0 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
2d300 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
2d310 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2d320 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
2d330 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
2d340 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
2d350 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
2d360 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
2d370 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
2d380 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
2d390 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
2d3a0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
2d3b0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2d3c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d3d0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
2d3e0 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
2d3f0 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
2d400 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
2d410 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
2d420 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
2d430 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
2d440 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
2d450 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
2d460 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
2d470 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
2d480 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
2d490 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
2d4a0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
2d4b0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
2d4c0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
2d4d0 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
2d4e0 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
2d4f0 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
2d500 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
2d510 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
2d520 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
2d530 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
2d540 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
2d550 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
2d560 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
2d570 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
2d580 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
2d590 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
2d5a0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
2d5b0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
2d5c0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
2d5d0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
2d5e0 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
2d5f0 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
2d600 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
2d610 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
2d620 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
2d630 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
2d640 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
2d650 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
2d660 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
2d670 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
2d680 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
2d690 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
2d6a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2d6b0 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
2d6c0 20 69 6e 74 20 70 69 64 2c 20 66 64 2c 20 67 6f   int pid, fd, go
2d6d0 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
2d6e0 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
2d6f0 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
2d700 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
2d710 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
2d720 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
2d730 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
2d740 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
2d750 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
2d760 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
2d770 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
2d780 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
2d790 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
2d7a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2d7b0 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
2d7c0 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e  (pid)<=(size_t)n
2d7d0 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
2d7e0 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
2d7f0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20  sizeof(pid);.   
2d800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
2d810 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
2d820 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
2d830 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
2d840 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
2d850 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
2d860 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
2d870 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
2d880 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2d890 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
2d8a0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
2d8b0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
2d8c0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
2d8d0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
2d8e0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2d8f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2d900 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
2d910 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
2d920 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2d930 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2d940 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
2d950 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
2d960 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
2d970 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
2d980 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2d990 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
2d9a0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
2d9b0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
2d9c0 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
2d9d0 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
2d9e0 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
2d9f0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
2da00 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
2da10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2da20 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
2da30 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
2da40 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2da50 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
2da60 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
2da70 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
2da80 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
2da90 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
2daa0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
2dab0 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
2dac0 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
2dad0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2dae0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
2daf0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
2db00 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
2db10 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
2db20 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
2db30 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
2db40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2db50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2db60 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
2db70 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
2db80 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
2db90 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
2dba0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
2dbb0 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
2dbc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2dbd0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2dbe0 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
2dbf0 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
2dc00 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2dc10 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
2dc20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
2dc30 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
2dc40 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
2dc50 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
2dc60 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
2dc70 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
2dc80 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
2dc90 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
2dca0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
2dcb0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
2dcc0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2dcd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
2dce0 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
2dcf0 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
2dd00 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
2dd10 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
2dd20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
2dd30 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2dd40 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2dd50 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2dd60 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2dd70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
2dd80 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2dd90 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2dda0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
2ddb0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
2ddc0 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
2ddd0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2dde0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2ddf0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
2de00 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
2de10 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
2de20 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
2de30 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
2de40 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
2de50 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
2de60 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
2de70 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
2de80 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
2de90 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
2dea0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
2deb0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2dec0 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
2ded0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2dee0 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
2def0 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2df00 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2df10 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
2df20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
2df30 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2df40 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2df50 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2df60 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2df70 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
2df80 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
2df90 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
2dfa0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
2dfb0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
2dfc0 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
2dfd0 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
2dfe0 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
2dff0 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2e000 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
2e010 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
2e020 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
2e030 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
2e040 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
2e050 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2e060 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
2e070 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
2e080 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
2e090 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
2e0a0 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69  Now;.  if( getti
2e0b0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
2e0c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e  )==0 ){.    *piN
2e0d0 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
2e0e0 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2e0f0 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
2e100 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
2e110 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1000;.  }else{. 
2e120 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2e130 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RROR;.  }.#endif
2e140 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e150 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2e160 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2e170 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2e180 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2e190 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2e1a0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2e1b0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2e1c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2e1d0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2e1e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e1f0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2e200 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2e210 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2e220 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2e230 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
2e240 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
2e250 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
2e260 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
2e270 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
2e280 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
2e290 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
2e2a0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2e2b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2e2c0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2e2d0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2e2e0 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
2e2f0 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
2e300 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20  _int64 i = 0;.  
2e310 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44  int rc;.  UNUSED
2e320 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2e330 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78  ed);.  rc = unix
2e340 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2e350 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
2e360 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2e370 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e380 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
2e390 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
2e3a0 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
2e3b0 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
2e3c0 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
2e3d0 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
2e3e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
2e3f0 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
2e400 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
2e410 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
2e420 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
2e430 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
2e440 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
2e450 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
2e460 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
2e470 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
2e480 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
2e490 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
2e4a0 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
2e4b0 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
2e4c0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
2e4d0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2e4e0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2e4f0 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
2e500 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
2e510 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2e520 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2e530 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2e540 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
2e550 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2e560 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
2e570 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
2e580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e590 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
2e5a0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2e5b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2e5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2e5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
2e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2e670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e680 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
2e690 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
2e6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2e6c0 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
2e6d0 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
2e6e0 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
2e6f0 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
2e700 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
2e710 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
2e720 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
2e730 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
2e740 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
2e750 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
2e760 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
2e770 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
2e780 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
2e790 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
2e7a0 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
2e7b0 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
2e7c0 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
2e7d0 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
2e7e0 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
2e7f0 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
2e800 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
2e810 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
2e820 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
2e830 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
2e840 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
2e850 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
2e860 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
2e870 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
2e880 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
2e890 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2e8a0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
2e8b0 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
2e8c0 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
2e8d0 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
2e8e0 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
2e8f0 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
2e900 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
2e910 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
2e920 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
2e930 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
2e940 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
2e950 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
2e960 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
2e970 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
2e980 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
2e990 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
2e9a0 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
2e9b0 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
2e9c0 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
2e9d0 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
2e9e0 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
2e9f0 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
2ea00 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
2ea10 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
2ea20 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
2ea30 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
2ea40 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
2ea50 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
2ea60 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
2ea70 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
2ea80 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
2ea90 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
2eaa0 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
2eab0 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
2eac0 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
2ead0 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
2eae0 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
2eaf0 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
2eb00 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
2eb10 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
2eb20 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
2eb30 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
2eb40 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
2eb50 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
2eb60 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
2eb70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
2eb80 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
2eb90 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
2eba0 34 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a  40000000..   ..*
2ebb0 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
2ebc0 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
2ebd0 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
2ebe0 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
2ebf0 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
2ec00 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
2ec10 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
2ec20 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
2ec30 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
2ec40 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
2ec50 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
2ec60 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
2ec70 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
2ec80 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
2ec90 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
2eca0 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
2ecb0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2ecc0 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
2ecd0 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
2ece0 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
2ecf0 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
2ed00 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
2ed10 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
2ed20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
2ed30 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
2ed40 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
2ed50 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
2ed60 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
2ed70 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
2ed80 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
2ed90 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
2eda0 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
2edb0 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
2edc0 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
2edd0 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
2ede0 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
2edf0 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
2ee00 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
2ee10 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2ee20 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
2ee30 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
2ee40 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
2ee50 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
2ee60 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
2ee70 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
2ee80 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
2ee90 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
2eea0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
2eeb0 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
2eec0 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
2eed0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
2eee0 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
2eef0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2ef00 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
2ef10 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
2ef20 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
2ef30 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
2ef40 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
2ef50 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
2ef60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
2ef70 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
2ef80 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
2ef90 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
2efa0 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
2efb0 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
2efc0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
2efd0 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
2efe0 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
2eff0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
2f000 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
2f010 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
2f020 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
2f030 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
2f040 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
2f050 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
2f060 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
2f070 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
2f080 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
2f090 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74  ILE, &<proxy_pat
2f0a0 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
2f0b0 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
2f0c0 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
2f0d0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
2f0e0 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
2f0f0 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
2f100 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
2f110 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
2f120 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
2f130 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
2f140 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
2f150 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
2f160 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
2f170 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
2f180 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
2f190 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2f1a0 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
2f1b0 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
2f1c0 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
2f1d0 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
2f1e0 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
2f1f0 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
2f200 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
2f210 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
2f220 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
2f230 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
2f240 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
2f250 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
2f260 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
2f270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2f280 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
2f290 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
2f2a0 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
2f2b0 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
2f2c0 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
2f2d0 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
2f2e0 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
2f2f0 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
2f300 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
2f310 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
2f320 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
2f330 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
2f340 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
2f350 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
2f360 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
2f370 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
2f380 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
2f390 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
2f3a0 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
2f3b0 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
2f3c0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
2f3d0 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
2f3e0 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
2f3f0 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
2f400 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
2f410 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
2f420 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
2f430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f440 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
2f450 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
2f460 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
2f470 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
2f480 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
2f490 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
2f4a0 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
2f4b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2f4c0 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
2f4d0 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
2f4e0 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
2f4f0 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
2f500 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
2f510 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
2f520 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
2f530 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
2f540 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
2f550 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
2f560 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
2f570 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
2f580 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
2f590 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
2f5a0 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
2f5b0 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
2f5c0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
2f5d0 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
2f5e0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
2f5f0 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
2f600 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
2f610 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
2f620 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
2f630 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
2f640 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
2f650 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
2f660 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
2f670 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
2f680 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
2f690 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
2f6a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2f6b0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
2f6c0 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
2f6d0 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
2f6e0 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
2f6f0 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
2f700 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
2f710 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
2f720 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
2f730 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f  it's contents do
2f740 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
2f750 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
2f760 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
2f770 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
2f780 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
2f790 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
2f7a0 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
2f7b0 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
2f7c0 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
2f7d0 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
2f7e0 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
2f7f0 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
2f800 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
2f810 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
2f820 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
2f830 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
2f840 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
2f850 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
2f860 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2f870 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
2f880 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
2f890 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2f8a0 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
2f8b0 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
2f8c0 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
2f8d0 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
2f8e0 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
2f8f0 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
2f900 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2f910 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
2f920 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
2f930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f940 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
2f950 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
2f960 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
2f970 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
2f980 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
2f990 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
2f9a0 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
2f9b0 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
2f9c0 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
2f9d0 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
2f9e0 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
2f9f0 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
2fa00 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
2fa10 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
2fa20 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
2fa30 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
2fa40 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
2fa50 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
2fa60 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
2fa70 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
2fa80 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
2fa90 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
2faa0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
2fab0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
2fac0 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
2fad0 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
2fae0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
2faf0 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
2fb00 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
2fb10 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
2fb20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
2fb30 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
2fb40 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
2fb50 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
2fb60 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
2fb70 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
2fb80 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
2fb90 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
2fba0 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
2fbb0 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
2fbc0 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
2fbd0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
2fbe0 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
2fbf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2fc00 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
2fc10 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2fc20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
2fc30 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
2fc40 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
2fc50 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
2fc60 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
2fc70 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
2fc80 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
2fc90 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
2fca0 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
2fcb0 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
2fcc0 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
2fcd0 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
2fce0 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
2fcf0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
2fd00 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
2fd10 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
2fd20 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
2fd30 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
2fd40 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
2fd50 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
2fd60 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
2fd70 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
2fd80 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
2fd90 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
2fda0 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
2fdb0 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
2fdc0 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
2fdd0 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
2fde0 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
2fdf0 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
2fe00 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
2fe10 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
2fe20 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
2fe30 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
2fe40 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
2fe50 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
2fe60 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
2fe70 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
2fe80 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
2fe90 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
2fea0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
2feb0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
2fec0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
2fed0 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
2fee0 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
2fef0 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
2ff00 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
2ff10 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2ff20 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
2ff30 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
2ff40 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
2ff50 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
2ff60 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
2ff70 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
2ff80 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
2ff90 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
2ffa0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2ffb0 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
2ffc0 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
2ffd0 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
2ffe0 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
2fff0 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
30000 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
30010 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67  xplicity calling
30020 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f   the SQLITE_SET_
30030 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
30040 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
30050 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
30060 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
30070 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
30080 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
30090 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
300a0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
300b0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
300c0 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
300d0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
300e0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
300f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
30100 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
30110 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
30120 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
30130 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
30140 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
30150 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
30160 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
30170 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
30180 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
30190 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
301a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
301b0 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
301c0 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
301d0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
301e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
301f0 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
30200 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
30210 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
30220 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
30230 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
30240 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
30250 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
30260 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
30270 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
30280 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
30290 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
302a0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
302b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
302c0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
302d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
302e0 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
302f0 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30310 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20   1 if the conch 
30320 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c  is held, -1 if l
30330 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69  ockless */.  voi
30340 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  d *oldLockingCon
30350 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69  text;     /* Ori
30360 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e  ginal lockingcon
30370 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20  text to restore 
30380 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71  on close */.  sq
30390 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
303a0 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68   const *pOldMeth
303b0 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  od;     /* Origi
303c0 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  nal I/O methods 
303d0 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a  for close */.};.
303e0 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ./* .** The prox
303f0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  y lock file path
30400 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
30410 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77  e at dbPath is w
30420 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74  ritten into lPat
30430 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73  h, .** which mus
30440 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64  t point to valid
30450 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  , writable memor
30460 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  y large enough f
30470 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67  or a maxLen leng
30480 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e  th.** file path.
30490 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
304a0 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
304b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50  (const char *dbP
304c0 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68  ath, char *lPath
304d0 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29  , size_t maxLen)
304e0 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  {.  int len;.  i
304f0 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20  nt dbLen;.  int 
30500 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50  i;..#ifdef LOCKP
30510 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20  ROXYDIR.  len = 
30520 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c  strlcpy(lPath, L
30530 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78  OCKPROXYDIR, max
30540 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66  Len);.#else.# if
30550 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55  def _CS_DARWIN_U
30560 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b  SER_TEMP_DIR.  {
30570 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74  .    if( !confst
30580 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
30590 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74  R_TEMP_DIR, lPat
305a0 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20  h, maxLen) ){.  
305b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45      OSTRACE(("GE
305c0 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65  TLOCKPATH  faile
305d0 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69  d %s errno=%d pi
305e0 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
305f0 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65          lPath, e
30600 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29 29  rrno, getpid()))
30610 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
30620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
30630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
30640 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
30650 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c   "sqliteplocks",
30660 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20   maxLen);    .  
30670 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d  }.# else.  len =
30680 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
30690 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29  "/tmp/", maxLen)
306a0 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  ;.# endif.#endif
306b0 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65  ..  if( lPath[le
306c0 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  n-1]!='/' ){.   
306d0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
306e0 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65  Path, "/", maxLe
306f0 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  n);.  }.  .  /* 
30700 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62  transform the db
30710 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75   path to a uniqu
30720 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a  e cache name */.
30730 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73    dbLen = (int)s
30740 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20  trlen(dbPath);. 
30750 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c   for( i=0; i<dbL
30760 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c  en && (i+len+7)<
30770 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b  (int)maxLen; i++
30780 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
30790 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c  dbPath[i];.    l
307a0 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63  Path[i+len] = (c
307b0 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20  =='/')?'_':c;.  
307c0 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d  }.  lPath[i+len]
307d0 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74  ='\0';.  strlcat
307e0 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  (lPath, ":auto:"
307f0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54  , maxLen);.  OST
30800 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
30810 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
30820 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
30830 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28  , lPath, getpid(
30840 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )));.  return SQ
30850 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
30860 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20   ** Creates the 
30870 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e  lock file and an
30880 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74  y missing direct
30890 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74  ories in lockPat
308a0 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h. */.static int
308b0 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
308c0 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
308d0 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e  *lockPath){.  in
308e0 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72  t i, len;.  char
308f0 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d   buf[MAXPATHLEN]
30900 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20  ;.  int start = 
30910 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c  0;.  .  assert(l
30920 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a  ockPath!=NULL);.
30930 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61    /* try to crea
30940 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72  te all the inter
30950 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72  mediate director
30960 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28  ies */.  len = (
30970 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50  int)strlen(lockP
30980 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d  ath);.  buf[0] =
30990 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20   lockPath[0];.  
309a0 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b  for( i=1; i<len;
309b0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20   i++ ){.    if( 
309c0 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27  lockPath[i] == '
309d0 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74  /' && (i - start
309e0 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f   > 0) ){.      /
309f0 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20  * only mkdir if 
30a00 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20  leaf dir != "." 
30a10 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a  or "/" or ".." *
30a20 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74  /.      if( i-st
30a30 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72  art>2 || (i-star
30a40 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72  t==1 && buf[star
30a50 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
30a60 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20  [start] != '/') 
30a70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d  .         || (i-
30a80 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b  start==2 && buf[
30a90 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
30aa0 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d   buf[start+1] !=
30ab0 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20   '.') ){.       
30ac0 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20   buf[i]='\0';.  
30ad0 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69        if( osMkdi
30ae0 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45  r(buf, SQLITE_DE
30af0 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
30b00 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20  ERMISSIONS) ){. 
30b10 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
30b20 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
30b30 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
30b40 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  T ) {.          
30b50 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
30b60 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c  TELOCKPATH  FAIL
30b70 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20  ED creating %s, 
30b80 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
30b90 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f         "'%s' pro
30ba0 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
30bb0 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bd0 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72  buf, strerror(er
30be0 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  r), lockPath, ge
30bf0 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
30c00 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72        return err
30c10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30c30 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b        start=i+1;
30c40 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69  .    }.    buf[i
30c50 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b  ] = lockPath[i];
30c60 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
30c70 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
30c80 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
30c90 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
30ca0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
30cb0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  )));.  return 0;
30cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
30cd0 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20   a new VFS file 
30ce0 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72  descriptor (stor
30cf0 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
30d00 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
30d10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e  lite3_malloc) an
30d20 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  d open the file 
30d30 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20  named "path" in 
30d40 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
30d50 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tor..**.** The c
30d60 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
30d70 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f  ible not only fo
30d80 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69  r closing the fi
30d90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
30da0 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72   but also for fr
30db0 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79  eeing the memory
30dc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
30dd0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
30de0 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
30df0 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55  int proxyCreateU
30e00 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e  nixFile(.    con
30e10 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
30e20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f        /* path fo
30e30 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  r the new unixFi
30e40 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69  le */.    unixFi
30e50 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20  le **ppFile,    
30e60 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63     /* unixFile c
30e70 72 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72  reated and retur
30e80 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20  ned by ref */.  
30e90 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65    int islockfile
30ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66             /* if
30eb0 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e   non zero missin
30ec0 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63  g dirs will be c
30ed0 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20  reated */.) {.  
30ee0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75  int fd = -1;.  u
30ef0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
30f00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30f10 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46  _OK;.  int openF
30f20 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
30f30 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74  O_CREAT;.  sqlit
30f40 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b  e3_vfs dummyVfs;
30f50 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20  .  int terrno = 
30f60 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  0;.  UnixUnusedF
30f70 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c  d *pUnused = NUL
30f80 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73  L;..  /* 1. firs
30f90 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72  t try to open/cr
30fa0 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  eate the file.  
30fb0 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61  ** 2. if that fa
30fc0 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73  ils, and this is
30fd0 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f   a lock file (no
30fe0 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72  t-conch), try cr
30ff0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
31000 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69  parent directori
31010 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20  es and then try 
31020 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69  again..  ** 3. i
31030 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72  f that fails, tr
31040 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  y to open the fi
31050 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a  le read-only.  *
31060 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75  * otherwise retu
31070 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b  rn BUSY (if lock
31080 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50   file) or CANTOP
31090 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  EN for the conch
310a0 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e   file.  */.  pUn
310b0 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
310c0 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e  bleFd(path, open
310d0 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55  Flags);.  if( pU
310e0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20  nused ){.    fd 
310f0 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
31100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75   }else{.    pUnu
31110 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
31120 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
31130 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20  used));.    if( 
31140 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
31150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31160 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
31170 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
31180 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
31190 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
311a0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72  ags, 0);.    ter
311b0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
311c0 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
311d0 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73  no==ENOENT && is
311e0 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
311f0 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74    if( proxyCreat
31200 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20  eLockPath(path) 
31210 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  == SQLITE_OK ){.
31220 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
31230 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
31240 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
31250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
31260 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
31270 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
31280 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
31290 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
312a0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
312b0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
312c0 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
312d0 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  fd<0 ){.    if( 
312e0 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
312f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31300 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
31310 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f    switch (terrno
31320 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ) {.      case E
31330 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72  ACCES:.        r
31340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
31350 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49  M;.      case EI
31360 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  O: .        retu
31370 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
31380 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68  LOCK; /* even th
31390 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63  ough it is the c
313a0 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65  onch */.      de
313b0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72  fault:.        r
313c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
313d0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
313e0 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20  }.  }.  .  pNew 
313f0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71  = (unixFile *)sq
31400 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
31410 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
31420 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
31430 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
31440 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
31450 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78   end_create_prox
31460 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  y;.  }.  memset(
31470 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
31480 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e  unixFile));.  pN
31490 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  ew->openFlags = 
314a0 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d  openFlags;.  mem
314b0 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30  set(&dummyVfs, 0
314c0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66  , sizeof(dummyVf
314d0 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  s));.  dummyVfs.
314e0 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64  pAppData = (void
314f0 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
31500 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  der;.  dummyVfs.
31510 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b  zName = "dummy";
31520 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  .  pUnused->fd =
31530 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e   fd;.  pUnused->
31540 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  flags = openFlag
31550 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73  s;.  pNew->pUnus
31560 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
31570 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
31580 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73  ixFile(&dummyVfs
31590 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66  , fd, (sqlite3_f
315a0 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c  ile*)pNew, path,
315b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
315c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
315d0 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a  *ppFile = pNew;.
315e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
315f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72  E_OK;.  }.end_cr
31600 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a  eate_proxy:    .
31610 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
31620 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  New, fd, __LINE_
31630 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  _);.  sqlite3_fr
31640 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69  ee(pNew);.  sqli
31650 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64  te3_free(pUnused
31660 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
31670 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
31680 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74  _TEST./* simulat
31690 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
316a0 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
316b0 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
316c0 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c  paths */.int sql
316d0 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
316e0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65  = 0;.#endif..#de
316f0 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49  fine PROXY_HOSTI
31700 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63  DLEN    16  /* c
31710 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69  onch file host i
31720 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20  d length */../* 
31730 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e  Not always defin
31740 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
31750 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f  s as it ought to
31760 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e   be */.extern in
31770 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75 75  t gethostuuid(uu
31780 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73  id_t id, const s
31790 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a  truct timespec *
317a0 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74  wait);../* get t
317b0 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67  he host ID via g
317c0 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48  ethostuuid(), pH
317d0 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74  ostID must point
317e0 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   to PROXY_HOSTID
317f0 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66  LEN .** bytes of
31800 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
31810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31820 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75  proxyGetHostID(u
31830 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48  nsigned char *pH
31840 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72  ostID, int *pErr
31850 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52  or){.  assert(PR
31860 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d  OXY_HOSTIDLEN ==
31870 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29   sizeof(uuid_t))
31880 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74  ;.  memset(pHost
31890 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53  ID, 0, PROXY_HOS
318a0 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65 66  TIDLEN);.#if def
318b0 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f  ined(__MAX_OS_X_
318c0 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
318d0 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20 20  IRED)\.         
318e0 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f        && __MAC_O
318f0 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
31900 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20 20  REQUIRED<1050.  
31910 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
31920 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
31930 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
31940 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
31950 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28  meout */.    if(
31960 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f   gethostuuid(pHo
31970 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20  stID, &timeout) 
31980 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
31990 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
319a0 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
319b0 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
319c0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
319d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
319e0 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
319f0 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
31a00 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f  _PARAMETER(pErro
31a10 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  r);.#endif.#ifde
31a20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
31a30 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
31a40 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
31a50 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
31a60 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
31a70 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
31a80 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
31a90 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
31aa0 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
31ab0 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
31ac0 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
31ad0 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
31ae0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
31af0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
31b00 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
31b10 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
31b20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
31b30 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
31b40 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
31b50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
31b60 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
31b70 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
31b80 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
31b90 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
31ba0 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
31bb0 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
31bc0 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
31bd0 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
31be0 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
31bf0 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
31c00 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
31c10 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
31c20 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
31c30 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
31c40 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
31c50 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
31c60 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
31c70 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
31c80 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
31c90 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
31ca0 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
31cb0 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
31cc0 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
31cd0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
31ce0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
31cf0 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
31d00 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
31d10 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
31d20 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
31d30 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
31d40 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
31d50 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
31d60 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
31d70 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
31d80 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
31d90 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
31da0 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
31db0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31dc0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31dd0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31de0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31df0 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
31e00 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
31e10 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
31e20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
31e30 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
31e40 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
31e50 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
31e60 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
31e70 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
31e80 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
31e90 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
31ea0 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
31eb0 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
31ec0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
31ed0 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20    int rc = -1;. 
31ee0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31ef0 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20  R(myHostID);..  
31f00 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  /* create a new 
31f10 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20  path by replace 
31f20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63  the trailing '-c
31f30 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65  onch' with '-bre
31f40 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e  ak' */.  pathLen
31f50 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68   = strlcpy(tPath
31f60 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48  , cPath, MAXPATH
31f70 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68  LEN);.  if( path
31f80 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c  Len>MAXPATHLEN |
31f90 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a  | pathLen<6 || .
31fa0 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74       (strlcpy(&t
31fb0 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c  Path[pathLen-5],
31fc0 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20   "break", 6) != 
31fd0 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  5) ){.    sqlite
31fe0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31ff0 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
32000 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65  ,"path error (le
32010 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68  n %d)",(int)path
32020 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
32030 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
32040 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
32050 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
32060 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50  .  readLen = osP
32070 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
32080 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
32090 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
320a0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
320b0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
320c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
320d0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
320e0 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64  sg),errmsg,"read
320f0 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
32100 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a  ,(int)readLen);.
32110 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
32120 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
32130 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
32140 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
32150 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
32160 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
32170 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f  tPath, (O_RDWR|O
32180 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20  _CREAT|O_EXCL), 
32190 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  0);.  if( fd<0 )
321a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
321b0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
321c0 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
321d0 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25  create failed (%
321e0 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
321f0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
32200 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ock;.  }.  if( o
32210 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c  sPwrite(fd, buf,
32220 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20   readLen, 0) != 
32230 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e  (ssize_t)readLen
32240 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
32250 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32260 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
32270 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28   "write failed (
32280 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
32290 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
322a0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
322b0 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50  rename(tPath, cP
322c0 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ath) ){.    sqli
322d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
322e0 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
322f0 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69  msg, "rename fai
32300 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
32310 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
32320 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
32330 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e   rc = 0;.  fprin
32340 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b  tf(stderr, "brok
32350 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  e stale lock on 
32360 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20  %s\n", cPath);. 
32370 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
32380 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  ile, conchFile->
32390 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
323a0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66  conchFile->h = f
323b0 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  d;.  conchFile->
323c0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
323d0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65  WR | O_CREAT;..e
323e0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20  nd_breaklock:.  
323f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
32400 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
32410 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29   osUnlink(tPath)
32420 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
32430 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20  lose(pFile, fd, 
32440 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
32450 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
32460 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  err, "failed to 
32470 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b  break stale lock
32480 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63   on %s, %s\n", c
32490 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20  Path, errmsg);. 
324a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
324b0 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72  }../* Take the r
324c0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e  equested lock on
324d0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
324e0 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c  and break a stal
324f0 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a  e lock if the .*
32500 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  * host id matche
32510 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
32520 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
32530 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
32540 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
32550 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b  , int lockType){
32560 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
32570 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
32580 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
32590 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
325a0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
325b0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
325c0 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
325d0 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  hFile;.  int rc 
325e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
325f0 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20  nt nTries = 0;. 
32600 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
32610 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20   conchModTime;. 
32620 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63   .  memset(&conc
32630 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a  hModTime, 0, siz
32640 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  eof(conchModTime
32650 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  ));.  do {.    r
32660 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
32670 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
32680 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
32690 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
326a0 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b  );.    nTries ++
326b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
326c0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
326d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63     /* If the loc
326e0 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a  k failed (busy):
326f0 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72  .       * 1st tr
32700 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74  y: get the mod t
32710 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ime of the conch
32720 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20  , wait 0.5s and 
32730 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20  try again. .    
32740 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61     * 2nd try: fa
32750 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69  il if the mod ti
32760 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f  me changed or ho
32770 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65  st id is differe
32780 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20  nt, wait .      
32790 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20   *           10 
327a0 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69  sec and try agai
327b0 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74  n.       * 3rd t
327c0 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  ry: break the lo
327d0 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f  ck unless the mo
327e0 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67  d time has chang
327f0 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed..       */.  
32800 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
32810 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  buf;.      if( o
32820 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65  sFstat(conchFile
32830 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
32840 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
32850 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
32860 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
32870 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
32880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32890 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
328a0 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  s==1 ){.        
328b0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62  conchModTime = b
328c0 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b  uf.st_mtimespec;
328d0 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
328e0 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  500000); /* wait
328f0 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79   0.5 sec and try
32900 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a   the lock again*
32910 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
32920 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ue;  .      }.. 
32930 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72       assert( nTr
32940 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69  ies>1 );.      i
32950 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e  f( conchModTime.
32960 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74  tv_sec != buf.st
32970 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65  _mtimespec.tv_se
32980 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63  c || .         c
32990 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e  onchModTime.tv_n
329a0 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
329b0 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20  imespec.tv_nsec 
329c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
329d0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
329e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
329f0 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
32a00 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63  2 ){  .        c
32a10 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d  har tBuf[PROXY_M
32a20 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
32a30 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f       int len = o
32a40 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65  sPread(conchFile
32a50 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59  ->h, tBuf, PROXY
32a60 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29  _MAXCONCHLEN, 0)
32a70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
32a80 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
32a90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
32aa0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
32ab0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
32ac0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
32ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32ae0 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50   if( len>PROXY_P
32af0 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75 66  ATHINDEX && tBuf
32b00 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59  [0]==(char)PROXY
32b10 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a  _CONCHVERSION){.
32b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
32b30 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
32b40 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  k if the host id
32b50 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a   doesn't match *
32b60 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
32b70 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b  0!=memcmp(&tBuf[
32b80 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
32b90 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
32ba0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a  Y_HOSTIDLEN) ){.
32bb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
32bc0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
32bd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32bf0 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
32c00 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eak the lock on 
32c10 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20  short read or a 
32c20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68  version mismatch
32c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
32c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
32c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32c60 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30      usleep(10000
32c70 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30  000); /* wait 10
32c80 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
32c90 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20   lock again */. 
32ca0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
32cb0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
32cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
32cd0 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20  Tries==3 );.    
32ce0 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72    if( 0==proxyBr
32cf0 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  eakConchLock(pFi
32d00 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b  le, myHostID) ){
32d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
32d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
32d30 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45   if( lockType==E
32d40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
32d50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32d60 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
32d70 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
32d80 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
32d90 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
32da0 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;          .    
32db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
32dc0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
32dd0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
32de0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
32df0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
32e00 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
32e10 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Type);.        }
32e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32e30 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51   } while( rc==SQ
32e40 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72  LITE_BUSY && nTr
32e50 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65  ies<3 );.  .  re
32e60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
32e70 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62  akes the conch b
32e80 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65  y taking a share
32e90 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20  d lock and read 
32ea0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e  the contents con
32eb0 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50  ch, if .** lockP
32ec0 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ath is non-NULL,
32ed0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
32ee0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
32ef0 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e  must match.  A N
32f00 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68  ULL .** lockPath
32f10 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
32f20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20  lockPath in the 
32f30 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
32f40 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a  be used if the .
32f50 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63  ** host IDs matc
32f60 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b  h, or a new lock
32f70 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65   path will be ge
32f80 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69  nerated automati
32f90 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72  cally .** and wr
32fa0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e  itten to the con
32fb0 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ch file..*/.stat
32fc0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65  ic int proxyTake
32fd0 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
32fe0 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c  pFile){.  proxyL
32ff0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
33000 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
33010 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
33020 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
33030 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43  xt; .  .  if( pC
33040 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30  tx->conchHeld!=0
33050 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
33070 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
33080 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
33090 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
330a0 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49    uuid_t myHostI
330b0 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f  D;.    int pErro
330c0 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  r = 0;.    char 
330d0 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41  readBuf[PROXY_MA
330e0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
330f0 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41  char lockPath[MA
33100 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63  XPATHLEN];.    c
33110 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74  har *tempLockPat
33120 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  h = NULL;.    in
33130 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33140 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74 65  ;.    int create
33150 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Conch = 0;.    i
33160 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d  nt hostIdMatch =
33170 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64   0;.    int read
33180 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Len = 0;.    int
33190 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
331a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72  = 0;.    int for
331b0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
331c0 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52  0;.    .    OSTR
331d0 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20  ACE(("TAKECONCH 
331e0 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
331f0 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  d\n", conchFile-
33200 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
33210 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
33220 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f  yPath ? pCtx->lo
33230 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a  ckProxyPath : ":
33240 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28  auto:"), getpid(
33250 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  )));..    rc = p
33260 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79  roxyGetHostID(my
33270 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29  HostID, &pError)
33280 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
33290 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
332a0 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  R ){.      pFile
332b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45  ->lastErrno = pE
332c0 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rror;.      goto
332d0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
332e0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
332f0 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  roxyConchLock(pF
33300 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53  ile, myHostID, S
33310 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
33320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
33340 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
33350 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61      }.    /* rea
33360 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  d the existing c
33370 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20  onch file */.   
33380 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41   readLen = seekA
33390 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65  ndRead((unixFile
333a0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20  *)conchFile, 0, 
333b0 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d  readBuf, PROXY_M
333c0 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20  AXCONCHLEN);.   
333d0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29   if( readLen<0 )
333e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65  {.      /* I/O e
333f0 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20  rror: lastErrno 
33400 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
33410 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c  ad */.      pFil
33420 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63  e->lastErrno = c
33430 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72  onchFile->lastEr
33440 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
33450 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
33460 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  D;.      goto en
33470 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
33480 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c   }else if( readL
33490 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45  en<=(PROXY_HEADE
334a0 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
334b0 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20  DLEN) || .      
334c0 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b 30         readBuf[0
334d0 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43  ]!=(char)PROXY_C
334e0 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20  ONCHVERSION ){. 
334f0 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20       /* a short 
33500 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20  read or version 
33510 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20  format mismatch 
33520 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
33530 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20   create a new . 
33540 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69       ** conch fi
33550 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  le. .      */.  
33560 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20      createConch 
33570 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  = 1;.    }.    /
33580 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  * if the host id
33590 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68 65   matches and the
335a0 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61   lock path alrea
335b0 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  dy exists in the
335c0 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65   conch.    ** we
335d0 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  'll try to use t
335e0 68 65 20 70 61 74 68 20 74 68 65 72 65 2c 20 69  he path there, i
335f0 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20  f we can't open 
33600 74 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c  that path, we'll
33610 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77   .    ** retry w
33620 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67  ith a new auto-g
33630 65 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a 20  enerated path . 
33640 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f     */.    do { /
33650 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65  * in case we nee
33660 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66  d to try again f
33670 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d  or an :auto: nam
33680 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  ed lock file */.
33690 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 65 61  .      if( !crea
336a0 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63  teConch && !forc
336b0 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  eNewLockPath ){.
336c0 20 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61          hostIdMa
336d0 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72  tch = !memcmp(&r
336e0 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  eadBuf[PROXY_HEA
336f0 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
33700 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  D, .            
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54        PROXY_HOST
33730 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  IDLEN);.        
33740 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
33750 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65  has data compare
33760 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f   the contents */
33770 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
33780 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33790 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
337a0 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64  * for auto-named
337b0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
337c0 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65  , just check the
337d0 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27   host ID and we'
337e0 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ll.           **
337f0 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c   use the local l
33800 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68  ock file path th
33810 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20  at's already in 
33820 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
33830 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
33840 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b  ( hostIdMatch ){
33850 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a  .            siz
33860 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72  e_t pathLen = (r
33870 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50  eadLen - PROXY_P
33880 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20  ATHINDEX);.     
33890 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
338a0 20 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e      if( pathLen>
338b0 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20  =MAXPATHLEN ){. 
338c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
338d0 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d  hLen=MAXPATHLEN-
338e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
338f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
33900 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72  cpy(lockPath, &r
33910 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54  eadBuf[PROXY_PAT
33920 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e  HINDEX], pathLen
33930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
33940 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d  ockPath[pathLen]
33950 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
33960 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d    tempLockPath =
33970 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20   lockPath;.     
33980 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63         tryOldLoc
33990 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  kPath = 1;.     
339a0 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65         /* create
339b0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
339c0 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68 65 20  ock path if the 
339d0 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a  conch is taken *
339e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  /.            go
339f0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
33a00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33a10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
33a20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20  hostIdMatch.    
33a30 20 20 20 20 20 20 20 20 20 20 20 26 26 20 21 73             && !s
33a40 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63  trncmp(pCtx->loc
33a50 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61  kProxyPath, &rea
33a60 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49  dBuf[PROXY_PATHI
33a70 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20  NDEX],.         
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f    readLen-PROXY_
33aa0 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20  PATHINDEX).     
33ab0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
33ac0 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e  /* conch host an
33ad0 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63  d lock path matc
33ae0 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  h */.          g
33af0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
33b00 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h; .        }.  
33b10 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
33b20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
33b30 63 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c  ch isn't writabl
33b40 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61  e and doesn't ma
33b50 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61  tch, we can't ta
33b60 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69  ke it */.      i
33b70 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f  f( (conchFile->o
33b80 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29  penFlags&O_RDWR)
33b90 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
33ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
33bb0 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  Y;.        goto 
33bc0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
33bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
33be0 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68      /* either th
33bf0 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d  e conch didn't m
33c00 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20  atch or we need 
33c10 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
33c20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  one */.      if(
33c30 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
33c40 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
33c50 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74   proxyGetLockPat
33c60 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  h(pCtx->dbPath, 
33c70 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54  lockPath, MAXPAT
33c80 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74  HLEN);.        t
33c90 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
33ca0 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
33cb0 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  /* create a copy
33cc0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74   of the lock pat
33cd0 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20  h _only_ if the 
33ce0 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a  conch is taken *
33cf0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
33d00 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65  .      /* update
33d10 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74   conch with host
33d20 20 61 6e 64 20 70 61 74 68 20 28 74 68 69 73 20   and path (this 
33d30 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68  will fail if oth
33d40 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20  er process.     
33d50 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65 64   ** has a shared
33d60 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20   lock already), 
33d70 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d  if the host id m
33d80 61 74 63 68 65 73 2c 20 75 73 65 20 74 68 65 20  atches, use the 
33d90 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69  big.      ** sti
33da0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
33db0 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68     futimes(conch
33dc0 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a  File->h, NULL);.
33dd0 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64        if( hostId
33de0 4d 61 74 63 68 20 26 26 20 21 63 72 65 61 74 65  Match && !create
33df0 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Conch ){.       
33e00 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e   if( conchFile->
33e10 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68 46  pInode && conchF
33e20 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
33e30 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ared>1 ){.      
33e40 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
33e50 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
33e60 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
33e70 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
33e80 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
33e90 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
33ea0 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
33eb0 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
33ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
33ed0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
33ee0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
33ef0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
33f00 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43       rc = proxyC
33f10 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
33f20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53  myHostID, EXCLUS
33f30 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
33f40 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
33f50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 63  {.        rc = c
33f60 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
33f70 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
33f80 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
33f90 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e, EXCLUSIVE_LOC
33fa0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
33fb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33fc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _OK ){.        c
33fd0 68 61 72 20 77 72 69 74 65 42 75 66 66 65 72 5b  har writeBuffer[
33fe0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
33ff0 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  N];.        int 
34000 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20  writeSize = 0;. 
34010 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
34020 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d  writeBuffer[0] =
34030 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e   (char)PROXY_CON
34040 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20  CHVERSION;.     
34050 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65     memcpy(&write
34060 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41  Buffer[PROXY_HEA
34070 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
34080 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
34090 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  EN);.        if(
340a0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
340b0 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  Path!=NULL ){.  
340c0 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28          strlcpy(
340d0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
340e0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
340f0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
34100 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
34110 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34120 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70            strlcp
34130 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  y(&writeBuffer[P
34140 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
34150 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d   tempLockPath, M
34160 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
34170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72      }.        wr
34180 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f  iteSize = PROXY_
34190 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c  PATHINDEX + strl
341a0 65 6e 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  en(&writeBuffer[
341b0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
341c0 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  );.        robus
341d0 74 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63  t_ftruncate(conc
341e0 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53  hFile->h, writeS
341f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ize);.        rc
34200 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73 71   = unixWrite((sq
34210 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e  lite3_file *)con
34220 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66  chFile, writeBuf
34230 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20  fer, writeSize, 
34240 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e  0);.        fsyn
34250 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b  c(conchFile->h);
34260 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77  .        /* If w
34270 65 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  e created a new 
34280 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20  conch file (not 
34290 6a 75 73 74 20 75 70 64 61 74 65 64 20 74 68 65  just updated the
342a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a   contents of a .
342b0 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69           ** vali
342c0 64 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74  d conch file), t
342d0 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
342e0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74  permissions of t
342f0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
34300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34320 4f 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63  OK && createConc
34330 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  h ){.          s
34340 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
34350 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
34360 72 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c  r = osFstat(pFil
34370 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20  e->h, &buf);.   
34380 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d         if( err==
34390 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
343a0 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20   mode_t cmode = 
343b0 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49  buf.st_mode&(S_I
343c0 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53  RUSR|S_IWUSR | S
343d0 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c  _IRGRP|S_IWGRP |
343e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48           S_IROTH
34410 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20  |S_IWOTH);.     
34420 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f         /* try to
34430 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62   match the datab
34440 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72  ase file R/W per
34450 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65  missions, ignore
34460 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e   failure */.#ifn
34470 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  def SQLITE_PROXY
34480 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 20  _DEBUG.         
34490 20 20 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63     osFchmod(conc
344a0 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29  hFile->h, cmode)
344b0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
344c0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
344d0 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 68        rc = osFch
344e0 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mod(conchFile->h
344f0 2c 20 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , cmode);.      
34500 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63        }while( rc
34510 3d 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d  ==(-1) && errno=
34520 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
34530 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
34540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
34550 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e   int code = errn
34560 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o;.             
34570 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
34580 20 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c   "fchmod %o FAIL
34590 45 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22  ED with %d %s\n"
345a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
345b0 20 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63          cmode, c
345c0 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
345d0 64 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  de));.          
345e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
345f0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
34600 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64  (stderr, "fchmod
34610 20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c   %o SUCCEDED\n",
34620 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  cmode);.        
34630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34650 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72     int code = er
34660 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
34670 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
34680 20 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64   "STAT FAILED[%d
34690 5d 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  ] with %d %s\n",
346a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
346b0 20 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c        err, code,
346c0 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
346d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
346e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
346f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
34700 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
34710 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
34720 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
34730 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
34740 0a 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f  .      .    end_
34750 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20  takeconch:.     
34760 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
34770 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64  PROXY: CLOSE  %d
34780 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
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 26 26 20 70 46 69 6c  QLITE_OK && pFil
347b0 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a  e->openFlags ){.
347c0 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 3b 0a          int fd;.
347d0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
347e0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
347f0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
34800 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
34810 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
34820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34830 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
34840 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
34850 73 74 5f 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62  st_open(pCtx->db
34860 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65  Path, pFile->ope
34870 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
34880 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52      OSTRACE(("TR
34890 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20  ANSPROXY: OPEN  
348a0 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20  %d\n", fd));.   
348b0 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29       if( fd>=0 )
348c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
348d0 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20  e->h = fd;.     
348e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
348f0 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41      rc=SQLITE_CA
34900 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20  NTOPEN_BKPT; /* 
34910 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f  SQLITE_BUSY? pro
34920 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c  xyTakeConch call
34930 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75  ed.           du
34940 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  ring locking */.
34950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34960 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
34970 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43  SQLITE_OK && !pC
34980 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  tx->lockProxy ){
34990 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
349a0 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61  ath = tempLockPa
349b0 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th ? tempLockPat
349c0 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h : pCtx->lockPr
349d0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
349e0 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
349f0 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20  eUnixFile(path, 
34a00 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  &pCtx->lockProxy
34a10 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
34a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34a30 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
34a40 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63  MEM && tryOldLoc
34a50 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
34a60 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27     /* we couldn'
34a70 74 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f  t create the pro
34a80 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74  xy lock file wit
34a90 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66  h the old lock f
34aa0 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ile path.       
34ab0 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67      ** so try ag
34ac0 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d  ain via auto-nam
34ad0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20  ing .           
34ae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
34af0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
34b00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79  1;.          try
34b10 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
34b20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
34b30 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20  nue; /* go back 
34b40 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69  to the do {} whi
34b50 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20  le start point, 
34b60 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  try again */.   
34b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34b80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34ba0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
34bb0 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
34bc0 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64   if we extracted
34bd0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
34be0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
34bf0 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68  conch file or th
34c00 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63  e path was alloc
34c10 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
34c20 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k.         */.  
34c30 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f        if( tempLo
34c40 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
34c50 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
34c60 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
34c70 33 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d  3DbStrDup(0, tem
34c80 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20  pLockPath);.    
34c90 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
34ca0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
34cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
34cc0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
34cd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34cf0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34d10 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
34d20 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  d = 1;.        .
34d30 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
34d40 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  ->lockProxy->pMe
34d50 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
34d60 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
34d70 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
34d80 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20  text *afpCtx;.  
34d90 20 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d          afpCtx =
34da0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
34db0 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b  ext *)pCtx->lock
34dc0 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  Proxy->lockingCo
34dd0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  ntext;.         
34de0 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20   afpCtx->dbPath 
34df0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
34e00 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
34e10 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
34e20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c          conchFil
34e30 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
34e40 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
34e50 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
34e60 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
34e70 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
34e80 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73  TAKECONCH  %d %s
34e90 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
34ea0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
34eb0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f    rc==SQLITE_OK?
34ec0 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b  "ok":"failed"));
34ed0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
34ee0 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31  ;.    } while (1
34ef0 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65  ); /* in case we
34f00 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74   need to retry t
34f10 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66  he :auto: lock f
34f20 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20  ile - .         
34f30 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68          ** we sh
34f40 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68  ould never get h
34f50 65 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74  ere except via t
34f60 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61  he 'continue' ca
34f70 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ll. */.  }.}../*
34f80 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c  .** If pFile hol
34f90 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63  ds a lock on a c
34fa0 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20  onch file, then 
34fb0 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63  release that loc
34fc0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
34fd0 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
34fe0 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
34ff0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  le){.  int rc = 
35000 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
35010 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
35020 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
35030 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35040 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a  ntext *pCtx;  /*
35050 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   The locking con
35060 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f  text for the pro
35070 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69  xy lock */.  uni
35080 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
35090 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ;        /* Name
350a0 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
350b0 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20  le */..  pCtx = 
350c0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
350d0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
350e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
350f0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
35100 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f  ->conchFile;.  O
35110 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45  STRACE(("RELEASE
35120 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
35130 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
35140 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
35150 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
35160 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
35170 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
35180 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20  : ":auto:"), .  
35190 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
351a0 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d  )));.  if( pCtx-
351b0 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
351c0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
351d0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
351e0 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
351f0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
35200 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70  O_LOCK);.  }.  p
35210 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
35220 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   0;.  OSTRACE(("
35230 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
35240 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
35250 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
35260 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
35270 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
35280 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
35290 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
352a0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
352b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63  database file, c
352c0 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20  ompute the name 
352d0 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c  of its conch fil
352e0 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  e..** Store the 
352f0 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69  conch filename i
35300 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
35310 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
35320 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65  alloc()..** Make
35330 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69   *pConchPath poi
35340 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61  nt to the new na
35350 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  me.  Return SQLI
35360 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
35370 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
35380 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  MEM if unable to
35390 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a   obtain memory..
353a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
353b0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
353c0 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
353d0 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  t the allocated 
353e0 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
353f0 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
35400 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e  eed..**.** *pCon
35410 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f  chPath is set to
35420 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72   NULL if a memor
35430 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
35440 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
35450 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
35460 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
35470 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  e(char *dbPath, 
35480 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74  char **pConchPat
35490 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  h){.  int i;    
354a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
354c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e  ter */.  int len
354d0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
354e0 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74  bPath); /* Lengt
354f0 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  h of database fi
35500 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20  lename - dbPath 
35510 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
35520 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
35530 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20     /* buffer in 
35540 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
35550 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f  ct conch name */
35560 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
35570 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f  space for the co
35580 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  nch filename and
35590 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
355a0 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65  name to.  ** the
355b0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69   name of the ori
355c0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
355d0 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f  ile. */  .  *pCo
355e0 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50  nchPath = conchP
355f0 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ath = (char *)sq
35600 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e  lite3_malloc(len
35610 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e   + 8);.  if( con
35620 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20  chPath==0 ){.   
35630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35640 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
35650 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62  py(conchPath, db
35660 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Path, len+1);.  
35670 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74  .  /* now insert
35680 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68   a "." before th
35690 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74  e last / charact
356a0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28  er */.  for( i=(
356b0 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d  len-1); i>=0; i-
356c0 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e  - ){.    if( con
356d0 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29  chPath[i]=='/' )
356e0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
356f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35700 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b    }.  conchPath[
35710 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20  i]='.';.  while 
35720 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63  ( i<len ){.    c
35730 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62  onchPath[i+1]=db
35740 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b  Path[i];.    i++
35750 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65  ;.  }..  /* appe
35760 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20  nd the "-conch" 
35770 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69  suffix to the fi
35780 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  le */.  memcpy(&
35790 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20  conchPath[i+1], 
357a0 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20  "-conch", 7);.  
357b0 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
357c0 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d  len(conchPath) =
357d0 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65  = len+7 );..  re
357e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
357f0 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66  }.../* Takes a f
35800 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ully configured 
35810 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74  proxy locking-st
35820 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e  yle unix file an
35830 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68  d switches.** th
35840 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
35850 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69  e path .*/.stati
35860 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b  c int switchLock
35870 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69  ProxyPath(unixFi
35880 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
35890 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
358a0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
358b0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
358c0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
358d0 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
358e0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72  gContext;.  char
358f0 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78   *oldPath = pCtx
35900 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
35910 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35920 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46  TE_OK;..  if( pF
35930 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
35940 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
35950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
35960 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e  Y;.  }  ..  /* n
35970 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20  othing to do if 
35980 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c  the path is NULL
35990 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63  , :auto: or matc
359a0 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67  hes the existing
359b0 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21   path */.  if( !
359c0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
359d0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
359e0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
359f0 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68   ||.    (oldPath
35a00 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64   && !strncmp(old
35a10 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50  Path, path, MAXP
35a20 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20  ATHLEN)) ){.    
35a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
35a50 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
35a60 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
35a70 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e  roxy;.    pCtx->
35a80 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a  lockProxy=NULL;.
35a90 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
35aa0 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eld = 0;.    if(
35ab0 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c   lockProxy!=NULL
35ac0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63   ){.      rc=loc
35ad0 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
35ae0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
35af0 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78  _file *)lockProx
35b00 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
35b10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
35b20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
35b30 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
35b40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
35b50 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20  ree(oldPath);.  
35b60 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
35b70 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
35b80 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29  bStrDup(0, path)
35b90 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
35ba0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
35bb0 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74  File is a file t
35bc0 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
35bd0 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78  ned by a prior x
35be0 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61  Open call.  dbPa
35bf0 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  th.** is a strin
35c00 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73  g buffer at leas
35c10 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63  t MAXPATHLEN+1 c
35c20 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a  haracters in siz
35c30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
35c40 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66  utine find the f
35c50 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74  ilename associat
35c60 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e  ed with pFile an
35c70 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69  d writes it.** i
35c80 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74  nt dbPath..*/.st
35c90 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
35ca0 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
35cb0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
35cc0 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68  le, char *dbPath
35cd0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
35ce0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20  _APPLE__).  if( 
35cf0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
35d00 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
35d10 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74  ){.    /* afp st
35d20 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66 65  yle keeps a refe
35d30 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20  rence to the db 
35d40 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65  path in the file
35d50 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20  Path field .    
35d60 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ** of the struct
35d70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35d80 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61  (int)strlen((cha
35d90 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
35da0 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41  gContext)<=MAXPA
35db0 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72  THLEN );.    str
35dc0 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28 61  lcpy(dbPath, ((a
35dd0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
35de0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
35df0 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74  gContext)->dbPat
35e00 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
35e10 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a    } else.#endif.
35e20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
35e30 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  thod == &dotlock
35e40 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
35e50 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79   /* dot lock sty
35e60 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b  le uses the lock
35e70 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73  ing context to s
35e80 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63  tore the dot loc
35e90 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61  k.    ** file pa
35ea0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  th */.    int le
35eb0 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
35ec0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
35ed0 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c  gContext) - strl
35ee0 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  en(DOTLOCK_SUFFI
35ef0 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64  X);.    memcpy(d
35f00 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
35f10 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35f20 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a  text, len + 1);.
35f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
35f40 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73  all other styles
35f50 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67   use the locking
35f60 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
35f70 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70 61  e the db file pa
35f80 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  th */.    assert
35f90 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  ( strlen((char*)
35fa0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
35fb0 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c  ntext)<=MAXPATHL
35fc0 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70  EN );.    strlcp
35fd0 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20  y(dbPath, (char 
35fe0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35ff0 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48  Context, MAXPATH
36000 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LEN);.  }.  retu
36010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
36020 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  ./*.** Takes an 
36030 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69  already filled i
36040 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  n unix file and 
36050 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c  alters it so all
36060 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a   file locking .*
36070 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72  * will be perfor
36080 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  med on the local
36090 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
360a0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
360b0 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70   fields.** are p
360c0 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 20  reserved in the 
360d0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
360e0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
360f0 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
36100 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74   .** the unix st
36110 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79  ructure properly
36120 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63   cleaned up at c
36130 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d  lose time:.**  -
36140 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  >lockingContext.
36150 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f  **  ->pMethod.*/
36160 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36170 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
36180 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
36190 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
361a0 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
361b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
361c0 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61  Ctx;.  char dbPa
361d0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d  th[MAXPATHLEN+1]
361e0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
361f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
36200 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
36210 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
36220 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36230 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
36240 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
36250 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
36260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
36270 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65  Y;.  }.  proxyGe
36280 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
36290 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68  le(pFile, dbPath
362a0 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  );.  if( !path |
362b0 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
362c0 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
362d0 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20   ":auto:") ){.  
362e0 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b    lockPath=NULL;
362f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
36300 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70  ckPath=(char *)p
36310 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53  ath;.  }.  .  OS
36320 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
36330 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  XY  %d for %s pi
36340 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
36350 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c  h,.           (l
36360 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61  ockPath ? lockPa
36370 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
36380 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70  getpid()));..  p
36390 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
363a0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
363b0 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74  tx) );.  if( pCt
363c0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
363d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
363e0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43  .  }.  memset(pC
363f0 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  tx, 0, sizeof(*p
36400 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70  Ctx));..  rc = p
36410 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50  roxyCreateConchP
36420 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20  athname(dbPath, 
36430 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
36440 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d  Path);.  if( rc=
36450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36460 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
36470 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d  teUnixFile(pCtx-
36480 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20  >conchFilePath, 
36490 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  &pCtx->conchFile
364a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
364b0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
364c0 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70  N && ((pFile->op
364d0 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
364e0 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  == 0) ){.      /
364f0 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f 70 65  * if (a) the ope
36500 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20  n flags are not 
36510 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65 20  O_RDWR, (b) the 
36520 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72  conch isn't ther
36530 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  e, and.      ** 
36540 28 63 29 20 74 68 65 20 66 69 6c 65 20 73 79 73  (c) the file sys
36550 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  tem is read-only
36560 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f  , then enable no
36570 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e  -locking access.
36580 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73  .      ** Ugh, s
36590 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30  ince O_RDONLY==0
365a0 78 30 30 30 30 20 77 65 20 74 65 73 74 20 66 6f  x0000 we test fo
365b0 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20  r !O_RDWR since 
365c0 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73  unixOpen asserts
365d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  .      ** that o
365e0 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61  penFlags will ha
365f0 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f  ve only one of O
36600 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57  _RDONLY or O_RDW
36610 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  R..      */.    
36620 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
36630 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  fsInfo;.      st
36640 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49  ruct stat conchI
36650 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67  nfo;.      int g
36660 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a  oLockless = 0;..
36670 20 20 20 20 20 20 69 66 28 20 6f 73 53 74 61 74        if( osStat
36680 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
36690 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f  Path, &conchInfo
366a0 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
366b0 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
366c0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
366d0 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26   (err==ENOENT) &
366e0 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68  & (statfs(dbPath
366f0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
36700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
36710 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49  oLockless = (fsI
36720 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
36730 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52  RDONLY) == MNT_R
36740 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d  DONLY;.        }
36750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36760 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b  f( goLockless ){
36770 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
36780 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f  onchHeld = -1; /
36790 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20  * read only FS/ 
367a0 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
367b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
367c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
367d0 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63  }.  }  .  if( rc
367e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
367f0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70  ockPath ){.    p
36800 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36810 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
36820 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68  rDup(0, lockPath
36830 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
36840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36850 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
36860 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
36870 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
36880 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61    if( pCtx->dbPa
36890 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th==NULL ){.    
368a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
368b0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
368c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
368d0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  OK ){.    /* all
368e0 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
368f0 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65  ated, proxys are
36900 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73   created and ass
36910 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  igned, .    ** s
36920 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e  witch the lockin
36930 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
36940 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72  ethod then retur
36950 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  n..    */.    pC
36960 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
36970 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c  ntext = pFile->l
36980 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
36990 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
369a0 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b  gContext = pCtx;
369b0 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  .    pCtx->pOldM
369c0 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70  ethod = pFile->p
369d0 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c  Method;.    pFil
369e0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72  e->pMethod = &pr
369f0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  oxyIoMethods;.  
36a00 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
36a10 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29  Ctx->conchFile )
36a20 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63  { .      pCtx->c
36a30 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
36a40 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
36a50 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e  e3_file *)pCtx->
36a60 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
36a70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
36a80 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
36a90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
36aa0 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78  e3DbFree(0, pCtx
36ab0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
36ac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
36ad0 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
36ae0 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71  lePath); .    sq
36af0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29  lite3_free(pCtx)
36b00 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
36b10 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
36b20 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
36b30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
36b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
36b50 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29  k" : "failed")))
36b60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
36b70 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
36b80 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71  utine handles sq
36b90 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
36ba0 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ol() calls that 
36bb0 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  are specific.** 
36bc0 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  to proxy locking
36bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36be0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
36bf0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
36c00 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
36c10 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *pArg){.  switch
36c20 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
36c30 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
36c40 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
36c50 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
36c60 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
36c70 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  id;.      if( pF
36c80 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
36c90 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20  &proxyIoMethods 
36ca0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
36cb0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
36cc0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
36cd0 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
36ce0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36cf0 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78  xt;.        prox
36d00 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
36d10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
36d20 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
36d30 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
36d40 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
36d50 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  pArg = pCtx->loc
36d60 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
36d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36d80 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
36d90 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75  r **)pArg = ":au
36da0 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b  to: (not held)";
36db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36dc0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
36dd0 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
36de0 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20  *)pArg = NULL;. 
36df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
36e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
36e10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
36e20 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
36e30 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
36e40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
36e50 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
36e60 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
36e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
36e80 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c   int isProxyStyl
36e90 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74  e = (pFile->pMet
36ea0 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
36eb0 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69  ethods);.      i
36ec0 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c  f( pArg==NULL ||
36ed0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
36ee0 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
36ef0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
36f00 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
36f10 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78  /* turn off prox
36f20 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20  y locking - not 
36f30 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
36f40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
36f50 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54  TE_ERROR /*SQLIT
36f60 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49  E_PROTOCOL? SQLI
36f70 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20  TE_MISUSE?*/;.  
36f80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36f90 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
36fa0 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
36fb0 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d   - already off -
36fc0 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20   NOOP */.       
36fd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
36fe0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
36ff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
37010 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74  oxyPath = (const
37020 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20   char *)pArg;.  
37030 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
37040 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
37050 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
37060 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
37070 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72  .            (pr
37080 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37090 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
370a0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
370b0 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
370c0 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20  pArg, ":auto:") 
370d0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
370e0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
370f0 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20 20  ath &&.         
37100 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70        !strncmp(p
37110 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37120 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d  th, proxyPath, M
37130 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20  AXPATHLEN)).    
37140 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
37150 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37160 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
37170 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
37180 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63    rc = switchLoc
37190 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65  kProxyPath(pFile
371a0 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
371b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
371c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
371d0 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72     /* turn on pr
371e0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
371f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
37200 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
37210 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  mUnixFile(pFile,
37220 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
37230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37240 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37250 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
37260 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
37270 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  t( 0 );  /* The 
37280 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61  call assures tha
37290 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63  t only valid opc
372a0 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f  odes are sent */
372b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
372c0 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65  OTREACHED*/.  re
372d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
372e0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68  R;.}../*.** With
372f0 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  in this division
37300 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c   (the proxying l
37310 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
37320 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65  ation) the proce
37330 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74  dures.** above t
37340 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c  his point are al
37350 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68  l utilities.  Th
37360 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d  e lock-related m
37370 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a  ethods of the.**
37380 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73   proxy-locking s
37390 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
373a0 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a   object follow..
373b0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  */.../*.** This 
373c0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
373d0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
373e0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
373f0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
37400 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
37410 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
37420 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
37430 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
37440 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
37450 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
37460 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
37470 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
37480 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
37490 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
374a0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
374b0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
374c0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
374d0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
374e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
374f0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
37500 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
37510 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
37520 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  Out) {.  unixFil
37530 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
37540 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
37550 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
37560 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
37570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37580 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
37590 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
375a0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
375b0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
375c0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
375d0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
375e0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
375f0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
37600 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
37610 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74  Proxy;.      ret
37620 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  urn proxy->pMeth
37630 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  od->xCheckReserv
37640 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  edLock((sqlite3_
37650 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65  file*)proxy, pRe
37660 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sOut);.    }else
37670 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c  { /* conchHeld <
37680 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a   0 is lockless *
37690 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d  /.      pResOut=
376a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
376b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
376c0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
376d0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
376e0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
376f0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
37700 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
37710 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
37720 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
37730 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
37740 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
37750 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
37760 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
37770 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
37780 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
37790 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
377a0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
377b0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
377c0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
377d0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
377e0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
377f0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
37800 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
37810 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
37820 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
37830 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
37840 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
37850 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
37860 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
37870 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
37880 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
37890 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
378a0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
378b0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
378c0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
378d0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
378e0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
378f0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
37900 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
37910 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
37920 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
37930 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
37940 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
37950 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
37960 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
37970 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
37980 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
37990 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
379a0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
379b0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
379c0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
379d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
379e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
379f0 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
37a00 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
37a10 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
37a20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
37a30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
37a40 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
37a50 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
37a60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37a70 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
37a80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
37a90 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
37aa0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
37ab0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
37ac0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
37ad0 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
37ae0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
37af0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
37b00 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
37b10 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
37b20 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
37b30 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
37b40 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  eFileLock);.    
37b50 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
37b60 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c  ck = proxy->eFil
37b70 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eLock;.    }else
37b80 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68  {.      /* conch
37b90 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b  Held < 0 is lock
37ba0 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  less */.    }.  
37bb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37bc0 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
37bd0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
37be0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
37bf0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
37c00 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
37c10 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
37c20 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
37c30 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
37c40 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
37c50 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
37c60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
37c70 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
37c80 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
37c90 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
37ca0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
37cb0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
37cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
37cd0 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
37ce0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
37cf0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
37d00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
37d10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
37d20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
37d30 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
37d40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
37d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
37d60 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37d70 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37d80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
37d90 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
37da0 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
37db0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
37dc0 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
37dd0 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
37de0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
37df0 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
37e00 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
37e10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
37e20 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b  oxy, eFileLock);
37e30 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
37e40 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d  ileLock = proxy-
37e50 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
37e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
37e70 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
37e80 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
37e90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
37ea0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
37eb0 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75  se a file that u
37ec0 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e  ses proxy locks.
37ed0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37ee0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
37ef0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
37f00 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
37f10 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
37f20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
37f30 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
37f40 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
37f50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37f60 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
37f70 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
37f80 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
37f90 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
37fa0 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78  kProxy;.    unix
37fb0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
37fc0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
37fd0 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e;.    int rc = 
37fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
37ff0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
38000 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
38010 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
38020 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
38030 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
38040 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  roxy, NO_LOCK);.
38050 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
38060 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
38070 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
38080 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
38090 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
380a0 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
380b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
380c0 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
380d0 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
380e0 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  y);.      pCtx->
380f0 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20  lockProxy = 0;. 
38100 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e     }.    if( con
38110 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  chFile ){.      
38120 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
38130 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  eld ){.        r
38140 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65  c = proxyRelease
38150 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
38160 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
38170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
38180 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e  }.      rc = con
38190 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
381a0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
381b0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
381c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
381d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
381e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
381f0 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
38200 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
38210 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63  ree(0, pCtx->loc
38220 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
38230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
38240 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
38250 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  h);.    sqlite3D
38260 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64  bFree(0, pCtx->d
38270 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72  bPath);.    /* r
38280 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69  estore the origi
38290 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  nal locking cont
382a0 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20  ext and pMethod 
382b0 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f  then close it */
382c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
382d0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
382e0 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  x->oldLockingCon
382f0 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
38300 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d  >pMethod = pCtx-
38310 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20  >pOldMethod;.   
38320 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
38330 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tx);.    return 
38340 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
38350 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a  xClose(id);.  }.
38360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38370 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20  OK;.}....#endif 
38380 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
38390 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
383a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
383b0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
383c0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
383d0 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65  style is intende
383e0 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41  d for use with A
383f0 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  FP filesystems..
38400 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50  ** And since AFP
38410 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
38420 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68  ed on MacOSX, th
38430 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
38440 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72  is also.** restr
38450 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e  icted to MacOSX.
38460 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .** .**.********
38470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
38480 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
38490 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
384a0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
384b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
384c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
384d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
384e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
384f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38500 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ******/../*.** I
38510 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
38520 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
38530 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
38540 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67