/ Hex Artifact Content
Login

Artifact 3d38767952d504486d182dea7b77279688011896:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1b80: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1b90: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1ba0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1bb0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1bc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1bd0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1be0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1bf0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c10: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1c20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1c30: 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b    int fileFlags;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c 6c        /* Miscell
1c60: 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20  anous flags */. 
1c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c80: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ca0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cb0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ce0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1cf0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d00: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d30: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d40: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d60: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d90: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1da0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1db0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dd0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1de0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1df0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e20: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e30: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e40: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e50: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e80: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1ea0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1eb0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ec0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ed0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ee0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ef0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f10: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f20: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f40: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f60: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f70: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f90: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fa0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fb0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fc0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fd0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fe0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1ff0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2000: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2010: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2020: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2030: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2040: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2050: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2060: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2070: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2080: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2090: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20a0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20c0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20d0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20e0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20f0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2100: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2110: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2120: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2130: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2140: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2150: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2160: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2170: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2180: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2190: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21a0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21b0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21d0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21e0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21f0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2200: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2210: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
2230: 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69 74  acros define bit
2240: 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69  s in unixFile.fi
2250: 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  leFlags.*/.#defi
2260: 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f  ne SQLITE_WHOLE_
2270: 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78  FILE_LOCKING  0x
2280: 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77 68  0001   /* Use wh
2290: 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ole-file locking
22a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
22b0: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
22c0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
22d0: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
22e0: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
22f0: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
2300: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
2310: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
2320: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
2330: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2340: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2350: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2360: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2370: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2380: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
2390: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
23a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
23b0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23c0: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
23d0: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
23e0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23f0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
2400: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
2410: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
2420: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
2430: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2440: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2450: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2460: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2470: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
2480: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2490: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
24a0: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
24b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
24c0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
24d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79  f../*.** Many sy
24e0: 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61  stem calls are a
24f0: 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20  ccessed through 
2500: 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74  pointer-to-funct
2510: 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20  ions so that.** 
2520: 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72  they may be over
2530: 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d  ridden at runtim
2540: 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  e to facilitate 
2550: 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20  fault injection 
2560: 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e  during.** testin
2570: 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67  g and sandboxing
2580: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2590: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65   array holds the
25a0: 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74   names and point
25b0: 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76  ers.** to all ov
25c0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
25d0: 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  m calls..*/.stat
25e0: 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73  ic struct unix_s
25f0: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
2600: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2610: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2620: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
2630: 20 20 76 6f 69 64 20 2a 70 43 75 72 72 65 6e 74    void *pCurrent
2640: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
2650: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2660: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2670: 0a 20 20 76 6f 69 64 20 2a 70 44 65 66 61 75 6c  .  void *pDefaul
2680: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  t;         /* De
2690: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
26a0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
26b0: 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20    { "open",     
26c0: 20 20 20 20 28 76 6f 69 64 2a 29 6f 70 65 6e 2c      (void*)open,
26d0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
26e0: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
26f0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2700: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2710: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2720: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2730: 22 2c 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a  ",        (void*
2740: 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20  )close,      0  
2750: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f  },.#define osClo
2760: 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  se     ((int(*)(
2770: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  int))aSyscall[1]
2780: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2790: 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20  "access",       
27a0: 28 76 6f 69 64 2a 29 61 63 63 65 73 73 2c 20 20  (void*)access,  
27b0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
27c0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
27d0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
27e0: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
27f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
2800: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
2810: 20 20 28 76 6f 69 64 2a 29 67 65 74 63 77 64 2c    (void*)getcwd,
2820: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2830: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
2840: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
2850: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2860: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
2870: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
2880: 20 20 20 28 76 6f 69 64 2a 29 73 74 61 74 2c 20     (void*)stat, 
2890: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
28a0: 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20  ine osStat      
28b0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
28c0: 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74  har*,struct stat
28d0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  *))aSyscall[4].p
28e0: 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20  Current)../*.** 
28f0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
2900: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
2910: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
2920: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
2930: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2940: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2950: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2960: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2970: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2980: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2990: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
29a0: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
29b0: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
29c0: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
29d0: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
29e0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
29f0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
2a00: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
2a10: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2a20: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2a30: 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62  fine osFstat(a,b
2a40: 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20  ,c)    0.#else  
2a50: 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c     .  { "fstat",
2a60: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 66          (void*)f
2a70: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
2a80: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
2a90: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2aa0: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
2ab0: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
2ac0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
2ad0: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
2ae0: 20 20 28 76 6f 69 64 2a 29 66 74 72 75 6e 63 61    (void*)ftrunca
2af0: 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  te,  0  },.#defi
2b00: 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28  ne osFtruncate (
2b10: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f  (int(*)(int,off_
2b20: 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  t))aSyscall[6].p
2b30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
2b40: 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 76  cntl",        (v
2b50: 6f 69 64 2a 29 66 63 6e 74 6c 2c 20 20 20 20 20  oid*)fcntl,     
2b60: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2b70: 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74  sFcntl     ((int
2b80: 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29  (*)(int,int,...)
2b90: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
2ba0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
2bb0: 64 22 2c 20 20 20 20 20 20 20 20 20 28 76 6f 69  d",         (voi
2bc0: 64 2a 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  d*)read,       0
2bd0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
2be0: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
2bf0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
2c00: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2c10: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
2c20: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
2c30: 52 45 41 44 29 20 7c 7c 20 64 65 66 69 6e 65 64  READ) || defined
2c40: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
2c50: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20  OCKING_STYLE).  
2c60: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
2c70: 20 20 28 76 6f 69 64 2a 29 70 72 65 61 64 2c 20    (void*)pread, 
2c80: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
2c90: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
2ca0: 20 20 20 20 20 28 76 6f 69 64 2a 29 30 2c 20 20       (void*)0,  
2cb0: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
2cc0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
2cd0: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
2ce0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
2cf0: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
2d00: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
2d10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2d20: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
2d30: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
2d40: 20 20 28 76 6f 69 64 2a 29 70 72 65 61 64 36 34    (void*)pread64
2d50: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
2d60: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
2d70: 20 20 20 20 20 28 76 6f 69 64 2a 29 30 2c 20 20       (void*)0,  
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
2d90: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
2da0: 72 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65  read64   ((ssize
2db0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
2dc0: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
2dd0: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
2de0: 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65  ent)..  { "write
2df0: 22 2c 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a  ",        (void*
2e00: 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20  )write,      0  
2e10: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  },.#define osWri
2e20: 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  te     ((ssize_t
2e30: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
2e40: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
2e50: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
2e60: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
2e70: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 64 65  USE_PREAD) || de
2e80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2e90: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ea0: 45 29 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  E).  { "pwrite",
2eb0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 77         (void*)pw
2ec0: 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a  rite,     0  },.
2ed0: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
2ee0: 65 22 2c 20 20 20 20 20 20 20 28 76 6f 69 64 2a  e",       (void*
2ef0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
2f00: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
2f10: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
2f20: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
2f30: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
2f40: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2f60: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
2f70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2f80: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
2f90: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
2fa0: 20 20 20 20 28 76 6f 69 64 2a 29 70 77 72 69 74      (void*)pwrit
2fb0: 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e64,   0  },.#el
2fc0: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34  se.  { "pwrite64
2fd0: 22 2c 20 20 20 20 20 28 76 6f 69 64 2a 29 30 2c  ",     (void*)0,
2fe0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2ff0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3000: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3010: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3020: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3030: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3040: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3050: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3060: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3070: 2c 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 66  ,       (void*)f
3080: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
3090: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
30a0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
30b0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
30c0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
30d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
30e0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
30f0: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
3100: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
3110: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3120: 28 76 6f 69 64 2a 29 70 6f 73 69 78 5f 66 61 6c  (void*)posix_fal
3130: 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65  locate,  0 },.#e
3140: 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61  lse.  { "falloca
3150: 74 65 22 2c 20 20 20 20 28 76 6f 69 64 2a 29 30  te",    (void*)0
3160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3170: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3180: 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65  fine osFallocate
3190: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
31a0: 66 5f 74 2c 6f 66 66 5f 74 29 61 53 79 73 63 61  f_t,off_t)aSysca
31b0: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
31c0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
31d0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
31e0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
31f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
3200: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
3210: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
3220: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
3230: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69  l of the.** "uni
3240: 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  x" VFSes.  Retur
3250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
3260: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
3270: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
3280: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
3290: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
32a0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
32b0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
32c0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
32d0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
32e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32f0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
3300: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3310: 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 54  otUsed,     /* T
3320: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
3330: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
3340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3350: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ,         /* Nam
3360: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
3370: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
3380: 20 20 76 6f 69 64 20 2a 70 4e 65 77 46 75 6e 63    void *pNewFunc
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
33b0: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
33c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
33d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33e0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 69 66  E_NOTFOUND;.  if
33f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
3400: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
3410: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
3420: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
3430: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
3440: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
3450: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
3460: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
3470: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3480: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3490: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
34a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
34b0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
34c0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
34d0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
34e0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
34f0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
3500: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3510: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
3520: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
3530: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
3540: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
3550: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
3560: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
3570: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
3580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
3590: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
35a0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
35b0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
35c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
35d0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
35e0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
35f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
3600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
3610: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
3620: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
3630: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
3640: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
3650: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3660: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3670: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
3680: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
3690: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
36a0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
36b0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
36c0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
36d0: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
36e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
36f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3700: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
3710: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
3720: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
3730: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
3740: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
3750: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
3760: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
3770: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
3780: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
3790: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
37a0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
37b0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
37c0: 76 6f 69 64 20 2a 75 6e 69 78 47 65 74 53 79 73  void *unixGetSys
37d0: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
37e0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 63  vfs *pNotUsed, c
37f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3800: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
3810: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
3820: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
3830: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
3840: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
3850: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
3860: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
3870: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
3880: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
3890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
38a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
38b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
38c0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
38d0: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
38e0: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
38f0: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
3900: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
3910: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
3920: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
3930: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
3940: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
3950: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
3960: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
3970: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
3980: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
3990: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
39a0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
39b0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
39c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
39d0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
39e0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
39f0: 0a 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 7d  .    i = -1;.  }
3a00: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
3a10: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
3a20: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
3a30: 73 63 61 6c 6c 5b 30 5d 29 2d 31 3b 20 69 2b 2b  scall[0])-1; i++
3a40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
3a50: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
3a60: 61 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[0].zName)==0
3a70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
3a80: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
3a90: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
3aa0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
3ab0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
3ac0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 30 5d   if( aSyscall[0]
3ad0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
3ae0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 30  eturn aSyscall[0
3af0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
3b00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
3b10: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
3b20: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
3b30: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
3b40: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
3b50: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
3b60: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
3b70: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
3b80: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
3b90: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
3ba0: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
3bb0: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
3bc0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
3bd0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
3be0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
3bf0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
3c00: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
3c10: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
3c20: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
3c30: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
3c40: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
3c50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3c60: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
3c70: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
3c80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
3c90: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
3ca0: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
3cb0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
3cc0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
3cd0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
3ce0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
3cf0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
3d00: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
3d10: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
3d20: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
3d30: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
3d40: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
3d50: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
3d60: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
3d70: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
3d80: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
3d90: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
3da0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
3db0: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
3dc0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3dd0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
3de0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
3df0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3e00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
3e10: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
3e20: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
3e30: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
3e40: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
3e50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
3e60: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
3e70: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
3e80: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
3e90: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
3ea0: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
3eb0: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
3ec0: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
3ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
3ee0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
3ef0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
3f00: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3f10: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
3f20: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
3f30: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
3f40: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
3f50: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
3f60: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
3f70: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
3f80: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
3f90: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
3fa0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
3fb0: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
3fc0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
3fd0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
3fe0: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
3ff0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
4000: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
4010: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
4020: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
4030: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
4040: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
4050: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
4060: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
4070: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
4080: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4090: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
40a0: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
40b0: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
40c0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
40d0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
40e0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
40f0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
4100: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
4110: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
4120: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
4130: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
4140: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
4150: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
4160: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
4170: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
4180: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
4190: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
41a0: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
41b0: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
41c0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
41d0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
41e0: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
41f0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
4200: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
4210: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
4220: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
4230: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
4240: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
4250: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4260: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
4270: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
4280: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
4290: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
42a0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
42b0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
42c0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
42d0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
42e0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
42f0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
4300: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
4310: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4320: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
4330: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
4340: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4350: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
4360: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
4370: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
4380: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
4390: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
43a0: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
43b0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
43c0: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
43d0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
43e0: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
43f0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
4400: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
4410: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
4420: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
4430: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
4440: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
4450: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
4460: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
4470: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4480: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
4490: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
44a0: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
44b0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
44c0: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
44d0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
44e0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
44f0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
4500: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
4510: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
4520: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
4530: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
4540: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
4550: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
4560: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
4570: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
4580: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
4590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
45a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
45b0: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
45c0: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
45d0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
45e0: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
45f0: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
4600: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
4610: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
4620: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
4630: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
4640: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
4650: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
4660: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
4670: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
4680: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72   */.../*.** Retr
4690: 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61  y ftruncate() ca
46a0: 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75  lls that fail du
46b0: 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  e to EINTR.*/.#i
46c0: 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
46d0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72  c int robust_ftr
46e0: 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71  uncate(int h, sq
46f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b  lite3_int64 sz){
4700: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
4710: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
4720: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
4730: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
4740: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
4750: 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
4760: 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 74  define robust_ft
4770: 72 75 6e 63 61 74 65 28 61 2c 62 29 20 6f 73 46  runcate(a,b) osF
4780: 74 72 75 6e 63 61 74 65 28 61 2c 62 29 0a 23 65  truncate(a,b).#e
4790: 6e 64 69 66 20 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif .../*.** Th
47a0: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
47b0: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
47c0: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
47d0: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
47e0: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
47f0: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
4800: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
4810: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
4820: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
4830: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
4840: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
4850: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
4860: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
4870: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
4880: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
4890: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
48a0: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
48b0: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
48c0: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
48d0: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
48e0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
48f0: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
4900: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
4910: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
4920: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
4930: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
4940: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
4950: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
4960: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
4970: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
4980: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
4990: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
49a0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
49b0: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 30 3a  ror) {.  case 0:
49c0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
49d0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 63  ITE_OK;.    .  c
49e0: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
49f0: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
4a00: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
4a10: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
4a20: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
4a30: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
4a40: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
4a50: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
4a60: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
4a70: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
4a80: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
4a90: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
4aa0: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
4ab0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4ac0: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
4ad0: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f  e EACCES: .    /
4ae0: 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65  * EACCES is like
4af0: 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c   EAGAIN during l
4b00: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
4b10: 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  s, but not any o
4b20: 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20  ther time*/.    
4b30: 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  if( (sqliteIOErr
4b40: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
4b50: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  _LOCK) || ..(sql
4b60: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
4b70: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
4b80: 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45   || ..(sqliteIOE
4b90: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
4ba0: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28  RR_RDLOCK) ||..(
4bb0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
4bc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
4bd0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29  KRESERVEDLOCK) )
4be0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
4bf0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
4c00: 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61  }.    /* else fa
4c10: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
4c20: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
4c30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
4c40: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61 73 65  ERM;.    .  case
4c50: 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65   EDEADLK:.    re
4c60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
4c70: 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 0a  R_BLOCKED;.    .
4c80: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
4c90: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
4ca0: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
4cb0: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
4cc0: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
4cd0: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
4ce0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
4cf0: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
4d00: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
4d10: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
4d20: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
4d30: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
4d40: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
4d50: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
4d60: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
4d70: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
4d80: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
4d90: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
4da0: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
4db0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
4dc0: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
4dd0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
4de0: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
4df0: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
4e00: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
4e10: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
4e20: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
4e30: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
4e40: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 20    case ESTALE:. 
4e50: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
4e60: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
4e70: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
4e80: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
4e90: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
4ea0: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
4eb0: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
4ec0: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
4ed0: 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   }.}..../*******
4ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f20: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
4f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
4f40: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
4f50: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
4f60: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
4f70: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
4f80: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
4f90: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
4fa0: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
4fb0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
4fc0: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
4fd0: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
4fe0: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
4ff0: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
5000: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
5010: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
5020: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
5030: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
5040: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
5050: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
5060: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
5070: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
5080: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
5090: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
50a0: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
50b0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
50c0: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
50d0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
50e0: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
50f0: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
5100: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
5110: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
5120: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
5130: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
5140: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
5150: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
5160: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5170: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
5180: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
5190: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
51a0: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
51b0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
51c0: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
51d0: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
51e0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
51f0: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
5200: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
5210: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
5220: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
5230: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
5240: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
5250: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
5260: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
5270: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
5280: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
5290: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
52a0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
52b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
52c0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
52d0: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
52e0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5300: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
5310: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
5320: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
5330: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
5340: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
5350: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
5360: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
5370: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
5380: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
5390: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
53a0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
53b0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
53c0: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
53d0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
53e0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
53f0: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
5400: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
5410: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
5420: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
5430: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
5440: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
5450: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
5460: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
5470: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
5480: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
5490: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
54a0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
54b0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
54c0: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
54d0: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
54e0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
54f0: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
5500: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
5510: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
5520: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
5530: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
5540: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
5550: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
5560: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
5570: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
5580: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
5590: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
55a0: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
55b0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
55c0: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
55d0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
55e0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
55f0: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
5600: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
5610: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
5620: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
5630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
5640: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
5650: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
5660: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
5670: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
5680: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
5690: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
56a0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
56b0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
56c0: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
56d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
56e0: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
56f0: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
5700: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
5710: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
5720: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
5730: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
5740: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
5750: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
5760: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
5770: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
5780: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
5790: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
57a0: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
57b0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
57c0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
57d0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
57e0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
57f0: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
5800: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
5810: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
5820: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
5830: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
5840: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
5850: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
5860: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
5870: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
5880: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
5890: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
58a0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
58b0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
58c0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
58d0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
58e0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
58f0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
5900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
5910: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5920: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
5930: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
5940: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
5950: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
5960: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
5970: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
5980: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
5990: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
59a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
59b0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
59c0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
59d0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
59e0: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5a10: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
5a20: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
5a30: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
5a40: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
5a50: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
5a60: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
5a70: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
5a80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
5a90: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
5aa0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
5ab0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
5ac0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
5ad0: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
5ae0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
5af0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
5b00: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
5b10: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
5b20: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
5b30: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
5b40: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
5b50: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
5b60: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
5b70: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
5b80: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
5b90: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
5ba0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
5bb0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
5bc0: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
5bd0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
5be0: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
5bf0: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
5c00: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5c10: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
5c20: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
5c30: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
5c40: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
5c50: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
5c60: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
5c70: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
5c80: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
5c90: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
5ca0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
5cb0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
5cc0: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
5cd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5ce0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
5cf0: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
5d00: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
5d10: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
5d20: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
5d30: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
5d40: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
5d50: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
5d60: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
5d70: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
5d80: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
5d90: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
5da0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
5db0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
5dc0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
5dd0: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
5de0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
5df0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
5e00: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
5e10: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
5e20: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
5e30: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
5e40: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
5e50: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
5e60: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
5e70: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
5e80: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
5e90: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
5ea0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5eb0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
5ec0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
5ed0: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
5ee0: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
5ef0: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
5f00: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
5f10: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
5f20: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
5f30: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
5f40: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
5f50: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
5f60: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
5f70: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
5f80: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
5f90: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
5fa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
5fb0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
5fc0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
5fd0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
5fe0: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
5ff0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
6000: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
6010: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
6020: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
6030: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6080: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
6090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60d0: 2a 2a 2a 2a 2a 2a 2a 0a 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 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
6100: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
6130: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
6140: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
6150: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
6160: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
6170: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
6180: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
6190: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
61a0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
61b0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
61c0: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
61d0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
61e0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
61f0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
6200: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
6210: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
6220: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
6230: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
6240: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
6250: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
6260: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
6270: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
6280: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
6290: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
62a0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
62b0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
62c0: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
62d0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
62e0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
62f0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
6300: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
6310: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
6320: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
6330: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
6340: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
6350: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
6360: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
6370: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
6380: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
6390: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
63a0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
63b0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
63c0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
63d0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
63e0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
63f0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
6400: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
6410: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
6420: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
6430: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
6440: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
6450: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
6460: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
6470: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
6480: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
6490: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
64a0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
64b0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
64c0: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
64d0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
64e0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
64f0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
6500: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
6510: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
6520: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
6530: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
6540: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
6550: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
6560: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
6570: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
6580: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
6590: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
65a0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
65b0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
65c0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
65d0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
65e0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
65f0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
6600: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
6610: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
6620: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
6630: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
6640: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
6650: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
6660: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
6670: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
6680: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
6690: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
66a0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
66b0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
66c0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
66d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
66e0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
66f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
6700: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
6710: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
6720: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
6730: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
6740: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
6750: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
6760: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
6770: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
6780: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
6790: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
67a0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
67b0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
67c0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
67d0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
67e0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
67f0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
6800: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
6810: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
6820: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
6830: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
6840: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
6850: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
6860: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
6870: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
6880: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
6890: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
68a0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
68b0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
68c0: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
68d0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
68e0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
68f0: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
6900: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
6910: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
6920: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
6930: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
6940: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
6950: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
6960: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
6970: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
6980: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
6990: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
69a0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
69b0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
69c0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
69d0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
69e0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
69f0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
6a00: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
6a10: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
6a20: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
6a30: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
6a40: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
6a50: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
6a60: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
6a70: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
6a80: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
6a90: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
6aa0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
6ab0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
6ac0: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
6ad0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
6ae0: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
6af0: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
6b00: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
6b10: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
6b20: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
6b30: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
6b40: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
6b50: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
6b60: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
6b70: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
6b80: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
6b90: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
6ba0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
6bb0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
6bc0: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
6bd0: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
6be0: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
6bf0: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
6c00: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
6c10: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
6c20: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
6c30: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
6c40: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
6c50: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
6c60: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
6c70: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
6c80: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
6c90: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
6ca0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
6cb0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
6cc0: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
6cd0: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
6ce0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
6cf0: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
6d00: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
6d10: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
6d20: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
6d30: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
6d40: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
6d50: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
6d60: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
6d70: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
6d80: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
6d90: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
6da0: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
6db0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
6dc0: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
6dd0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6de0: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
6df0: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
6e00: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
6e10: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
6e20: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
6e30: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
6e40: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
6e50: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
6e60: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
6e70: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
6e80: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
6e90: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
6ea0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
6eb0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
6ec0: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
6ed0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
6ee0: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
6ef0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
6f00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6f10: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
6f20: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
6f30: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
6f40: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
6f50: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
6f60: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
6f70: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
6f80: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
6f90: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
6fa0: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
6fb0: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
6fc0: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
6fd0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
6fe0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
6ff0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
7000: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
7010: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
7020: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
7030: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
7040: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
7050: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
7060: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
7070: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
7080: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
7090: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
70a0: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
70b0: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
70c0: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
70d0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
70e0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
70f0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
7100: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
7110: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
7120: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
7130: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
7140: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
7150: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
7160: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
7170: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
7180: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
7190: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
71a0: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
71b0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
71c0: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
71d0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
71e0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
71f0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7200: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
7210: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
7220: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
7230: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
7240: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
7250: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
7260: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
7270: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
7280: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
7290: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
72a0: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
72b0: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
72c0: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
72d0: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
72e0: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
72f0: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
7300: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
7310: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
7320: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
7330: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
7340: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
7350: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
7360: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
7370: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7380: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
7390: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
73a0: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
73b0: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
73c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
73d0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
73e0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
73f0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
7400: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
7410: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
7420: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
7430: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
7440: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
7450: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
7460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
7470: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
7480: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
7490: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
74a0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
74b0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
74c0: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
74d0: 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  lse.  ino_t ino;
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
7500: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
7510: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
7520: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7530: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
7540: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
7550: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
7560: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
7570: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
7580: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
7590: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
75a0: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
75b0: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
75c0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
75d0: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
75e0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
75f0: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
7600: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
7610: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
7620: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
7630: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
7640: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
7650: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
7660: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
7670: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
7680: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
7690: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
76a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20  nixInodeInfo {. 
76b0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
76c0: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
76d0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
76e0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  ey */.  int nSha
76f0: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
7700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7710: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
7720: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
7730: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
7740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7750: 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43  ne of SHARED_LOC
7760: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
7770: 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e   etc. */.  int n
7780: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
7790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77a0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
77b0: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
77c0: 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  re */.  unixShmN
77d0: 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
77e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
77f0: 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
7800: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
7810: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
7820: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
7830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7840: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
7850: 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a  g file locks */.
7860: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
7870: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
7880: 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65    /* Unused file
7890: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20   descriptors to 
78a0: 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49  close */.  unixI
78b0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
78c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
78d0: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
78e0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
78f0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
7900: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
7910: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
7920: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
7930: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
7940: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7950: 4e 47 5f 53 54 59 4c 45 29 0a 20 20 75 6e 73 69  NG_STYLE).  unsi
7960: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
7970: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
7980: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
7990: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
79a0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
79b0: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
79c0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
79d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
79e0: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
79f0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
7a00: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
7a10: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
7a20: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
7a30: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
7a40: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
7a50: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
7a60: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
7a70: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
7a80: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
7a90: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
7aa0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
7ab0: 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73  LogError_x(), is
7ac0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
7ad0: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
7ae0: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
7af0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
7b00: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
7b10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
7b20: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
7b30: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
7b40: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
7b50: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
7b60: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
7b70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7b80: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
7b90: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
7ba0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
7bb0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
7bc0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
7bd0: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
7be0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
7bf0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
7c00: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
7c10: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
7c20: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
7c30: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
7c40: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
7c50: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
7c60: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
7c70: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7c80: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
7c90: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
7ca0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
7cb0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
7cc0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
7cd0: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
7ce0: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
7cf0: 20 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73   and the the ass
7d00: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
7d10: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
7d20: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
7d30: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
7d40: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
7d50: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
7d60: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
7d70: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
7d80: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
7d90: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7db0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
7dc0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7dd0: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
7de0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7df0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
7e00: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
7e10: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e30: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
7e40: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
7e50: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
7e80: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
7e90: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
7ea0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
7eb0: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
7ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
7ed0: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
7ee0: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
7ef0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
7f00: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
7f10: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
7f20: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
7f30: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
7f40: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
7f50: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
7f60: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
7f70: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
7f80: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
7f90: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
7fa0: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
7fb0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
7fc0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
7fd0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
7fe0: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
7ff0: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
8000: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
8010: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
8020: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
8030: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
8040: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
8050: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
8060: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
8070: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
8080: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
8090: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
80a0: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
80b0: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
80c0: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
80d0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
80e0: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
80f0: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
8100: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
8110: 74 68 61 74 20 0a 20 20 2a 2a 20 72 65 74 75 72  that .  ** retur
8120: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
8130: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
8140: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
8150: 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e  ssage. That poin
8160: 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f  ter .  ** may po
8170: 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f  int to aErr[], o
8180: 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74  r it may point t
8190: 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74  o some static st
81a0: 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e  orage somewhere.
81b0: 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
81c0: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
81d0: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
81e0: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
81f0: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72  ion of .  ** str
8200: 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68  error_r(), which
8210: 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61   always writes a
8220: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8230: 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a  into aErr[]..  *
8240: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f  *.  ** If the co
8250: 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61  de incorrectly a
8260: 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
8270: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
8280: 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ion that is.  **
8290: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20   available, the 
82a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
82b0: 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65  ll often be an e
82c0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74  mpty string. Not
82d0: 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f   a.  ** huge pro
82e0: 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c  blem. Incorrectl
82f0: 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61  y concluding tha
8300: 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  t the GNU versio
8310: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a  n is available .
8320: 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20    ** could lead 
8330: 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68  to a segfault th
8340: 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64  ough..  */.#if d
8350: 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f  efined(STRERROR_
8360: 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66  R_CHAR_P) || def
8370: 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a  ined(__USE_GNU).
8380: 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69    zErr = .# endi
8390: 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69  f.  strerror_r(i
83a0: 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a  Errno, aErr, siz
83b0: 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23  eof(aErr)-1);..#
83c0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  elif SQLITE_THRE
83d0: 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73  ADSAFE.  /* This
83e0: 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65   is a threadsafe
83f0: 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65   build, but stre
8400: 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20  rror_r() is not 
8410: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20  available. */.  
8420: 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65  zErr = "";.#else
8430: 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64  .  /* Non-thread
8440: 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20  safe build, use 
8450: 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20  strerror(). */. 
8460: 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72   zErr = strerror
8470: 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66  (iErrno);.#endif
8480: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ..  assert( errc
8490: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
84a0: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
84b0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
84c0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
84d0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
84e0: 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20  unix.c:%d: (%d) 
84f0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
8500: 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e      iLine, iErrn
8510: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
8520: 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65   zErr.  );..  re
8530: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
8540: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
8550: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
8560: 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
8570: 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d  that close() alm
8580: 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73  ost always works
8590: 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e  , since it is on
85a0: 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20  ly in a.** very 
85b0: 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e  sick application
85c0: 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69   or on a very si
85d0: 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74  ck platform that
85e0: 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a   it might fail..
85f0: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61  ** If it does fa
8600: 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20  il, simply leak 
8610: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
8620: 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20  tor, but do log 
8630: 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a  the.** error..**
8640: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74  .** Note that it
8650: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
8660: 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66  retry close() af
8670: 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20  ter EINTR since 
8680: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
8690: 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76  riptor might hav
86a0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
86b0: 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72  eused by another
86c0: 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77   thread..** So w
86d0: 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79  e don't even try
86e0: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
86f0: 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74   an EINTR.  Just
8700: 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a   log the error.*
8710: 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a  * and move on..*
8720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
8730: 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46  bust_close(unixF
8740: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
8750: 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  h, int lineno){.
8760: 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29    if( osClose(h)
8770: 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   ){.    unixLogE
8780: 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54  rrorAtLine(SQLIT
8790: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22  E_IOERR_CLOSE, "
87a0: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20  close",.        
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
87c0: 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50  File ? pFile->zP
87d0: 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29  ath : 0, lineno)
87e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
87f0: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
8800: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
8810: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
8820: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
8830: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
8840: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
8850: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
8860: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
8870: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
8880: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
8890: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
88a0: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
88b0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
88c0: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
88d0: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
88e0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
88f0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f  p->pNext;.    ro
8900: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
8910: 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , p->fd, __LINE_
8920: 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  _);.    sqlite3_
8930: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70  free(p);.  }.  p
8940: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
8950: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
8960: 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65  ease a unixInode
8970: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
8980: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
8990: 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65  ted by findInode
89a0: 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Info()..**.** Th
89b0: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
89c0: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
89d0: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
89e0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
89f0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
8a00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
8a10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8a20: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
8a30: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
8a40: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
8a50: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
8a60: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
8a70: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
8a80: 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
8a90: 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 70 49  pInode ){.    pI
8aa0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
8ab0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
8ac0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
8ad0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
8ae0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
8af0: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
8b00: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
8b10: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
8b20: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
8b30: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
8b40: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
8b50: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
8b60: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
8b70: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
8b80: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
8b90: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8ba0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
8bb0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
8bc0: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
8bd0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
8be0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
8bf0: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
8c00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
8c10: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
8c20: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
8c30: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
8c40: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
8c50: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
8c60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8c70: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
8c80: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8c90: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
8ca0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
8cb0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
8cc0: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
8cd0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
8ce0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
8cf0: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
8d00: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
8d10: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
8d20: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
8d30: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
8d40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8d50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
8d60: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
8d70: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
8d80: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
8d90: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
8da0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
8db0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
8dc0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
8dd0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
8de0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
8df0: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
8e00: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
8e10: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
8e20: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
8e30: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
8e40: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
8e50: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
8e60: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
8e70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
8e80: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8e90: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
8ea0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
8ed0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
8ee0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
8f10: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
8f20: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
8f30: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
8f40: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
8f50: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
8f60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
8f70: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
8f80: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
8f90: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
8fa0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
8fb0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
8fc0: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
8fd0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
8fe0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8ff0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
9000: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
9010: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
9020: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
9030: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
9040: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
9050: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
9060: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
9070: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
9080: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
9090: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
90a0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
90b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
90c0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
90d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
90e0: 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a  ifdef EOVERFLOW.
90f0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
9100: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
9110: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
9120: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
9130: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
9140: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
9150: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
9160: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
9170: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
9180: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
9190: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
91a0: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
91b0: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
91c0: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
91d0: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
91e0: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
91f0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
9200: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
9210: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
9220: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
9230: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
9240: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
9250: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
9260: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
9270: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
9280: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
9290: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
92a0: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
92b0: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
92c0: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
92d0: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
92e0: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
92f0: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
9300: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
9310: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
9320: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
9330: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
9340: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
9350: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
9360: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
9370: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
9380: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
9390: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
93a0: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
93b0: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
93c0: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
93d0: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
93e0: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
93f0: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
9400: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f  OS)!=0 ){.    do
9410: 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66  { rc = osWrite(f
9420: 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69  d, "S", 1); }whi
9430: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
9440: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
9450: 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20  if( rc!=1 ){.   
9460: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9470: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
9480: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9490: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
94a0: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
94b0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
94c0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
94d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
94e0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
94f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9500: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
9510: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65    }.#endif..  me
9520: 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c  mset(&fileId, 0,
9530: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
9540: 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d  ;.  fileId.dev =
9550: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
9560: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9570: 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70    fileId.pId = p
9580: 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65  File->pId;.#else
9590: 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20  .  fileId.ino = 
95a0: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
95b0: 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20  #endif.  pInode 
95c0: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  = inodeList;.  w
95d0: 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
95e0: 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20  memcmp(&fileId, 
95f0: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
9600: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
9610: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
9620: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
9630: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65    }.  if( pInode
9640: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ==0 ){.    pInod
9650: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
9660: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f  oc( sizeof(*pIno
9670: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  de) );.    if( p
9680: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
9690: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
96a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
96b0: 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20   memset(pInode, 
96c0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  0, sizeof(*pInod
96d0: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e));.    memcpy(
96e0: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
96f0: 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66   &fileId, sizeof
9700: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70  (fileId));.    p
9710: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
9720: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
9730: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
9740: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
9750: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
9760: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
9770: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
9780: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
9790: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
97a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
97b0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
97c0: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
97d0: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
97e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
97f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9800: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
9810: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
9820: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
9830: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
9840: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
9850: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
9860: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
9870: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
9880: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
9890: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
98a0: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
98b0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
98c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
98d0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
98e0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
98f0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
9900: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
9910: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
9920: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
9930: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
9940: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
9950: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
9960: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9970: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
9980: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
9990: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
99a0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
99b0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
99c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
99d0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
99e0: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
99f0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
9a00: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
9a10: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
9a20: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
9a30: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
9a40: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
9a50: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
9a60: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
9a70: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
9a80: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
9a90: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
9aa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
9ab0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
9ac0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
9ad0: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
9ae0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
9af0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
9b00: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
9b10: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
9b20: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
9b30: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
9b40: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
9b50: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
9b60: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
9b70: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
9b80: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
9b90: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
9ba0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20  F_WRLCK;.    if 
9bb0: 28 2d 31 20 3d 3d 20 6f 73 46 63 6e 74 6c 28 70  (-1 == osFcntl(p
9bc0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
9bd0: 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20  , &lock)) {.    
9be0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
9bf0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9c00: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
9c10: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
9c20: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
9c30: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
9c40: 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  K);.      pFile-
9c50: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
9c60: 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
9c70: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
9c80: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
9c90: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
9ca0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
9cb0: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
9cc0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
9cd0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
9ce0: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
9cf0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
9d00: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
9d10: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
9d20: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
9d30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
9d40: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
9d50: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
9d60: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
9d70: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
9d80: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
9d90: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
9da0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
9db0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
9dc0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
9dd0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
9de0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
9df0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
9e00: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
9e10: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
9e20: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
9e30: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
9e40: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
9e50: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
9e60: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
9e70: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
9e80: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
9e90: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
9ea0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
9eb0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
9ec0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
9ed0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
9ee0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
9ef0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
9f00: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
9f10: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
9f20: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
9f30: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
9f40: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
9f50: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
9f60: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
9f70: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
9f80: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
9f90: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
9fa0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
9fb0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
9fc0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
9fd0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
9fe0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
9ff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
a000: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
a010: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
a020: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
a030: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
a040: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
a050: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
a060: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
a070: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
a080: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
a090: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
a0a0: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
a0b0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
a0c0: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
a0d0: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
a0e0: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
a0f0: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
a100: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
a110: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
a120: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
a130: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
a140: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
a150: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
a160: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
a170: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
a180: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
a190: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
a1a0: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
a1b0: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
a1c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
a1d0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
a1e0: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20  windows systems 
a1f0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
a200: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
a210: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
a220: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
a230: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
a240: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
a250: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
a260: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
a270: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
a280: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
a290: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
a2a0: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
a2b0: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
a2c0: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
a2d0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
a2e0: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
a2f0: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
a300: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
a310: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
a320: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
a330: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
a340: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
a350: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
a360: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
a370: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
a380: 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f  cessful, a rando
a390: 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20  m byte from the 
a3a0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
a3b0: 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64  * range' is read
a3c0: 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  -locked and the 
a3d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
a3e0: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
a3f0: 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  sed..  **.  ** A
a400: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
a410: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
a420: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
a430: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
a440: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
a450: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
a460: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
a470: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
a480: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
a490: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
a4a0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
a4b0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
a4c0: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
a4d0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
a4e0: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
a4f0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
a500: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
a510: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
a520: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
a530: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
a540: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
a550: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
a560: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
a570: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
a580: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
a590: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
a5a0: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
a5b0: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
a5c0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
a5d0: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
a5e0: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
a5f0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
a600: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
a610: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
a620: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
a630: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
a640: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
a650: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
a660: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
a670: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
a680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
a690: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
a6a0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
a6b0: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
a6c0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
a6d0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
a6e0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
a6f0: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
a700: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
a710: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
a720: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
a730: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
a740: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
a750: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
a760: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
a770: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
a780: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
a790: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
a7a0: 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  se. .  **.  ** T
a7b0: 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67  he reason a sing
a7c0: 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62  le byte cannot b
a7d0: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
a7e0: 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  f the 'shared by
a7f0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
a800: 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  s that some vers
a810: 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20  ions of windows 
a820: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72  do not support r
a830: 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20  ead-locks. By.  
a840: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e  ** locking a ran
a850: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20  dom byte from a 
a860: 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e  range, concurren
a870: 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d  t SHARED locks m
a880: 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76  ay exist.  ** ev
a890: 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e  en if the lockin
a8a0: 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64  g primitive used
a8b0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69   is always a wri
a8c0: 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  te-lock..  */.  
a8d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a8e0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
a8f0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
a900: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
a910: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
a920: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
a930: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
a940: 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d 20 30  ock;.  int s = 0
a950: 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d  ;.  int tErrno =
a960: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
a970: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
a980: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
a990: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
a9a0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
a9b0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
a9c0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
a9d0: 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
a9e0: 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
a9f0: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46  Lock),.      azF
aa00: 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e  ileLock(pInode->
aa10: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f  eFileLock), pIno
aa20: 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
aa30: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
aa40: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
aa50: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
aa60: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
aa70: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
aa80: 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
aa90: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
aaa0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
aab0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
aac0: 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
aad0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
aae0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
aaf0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
ab00: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
ab10: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
ab20: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
ab30: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
ab40: 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29  ady held) (unix)
ab50: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
ab60: 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
ab70: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
ab80: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
ab90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
aba0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
abb0: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
abc0: 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
abd0: 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
abe0: 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
abf0: 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
ac00: 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
ac10: 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
ac20: 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
ac30: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
ac40: 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
ac50: 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
ac60: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
ac70: 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
ac80: 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
ac90: 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
aca0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
acb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
acc0: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
acd0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ace0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
acf0: 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
ad00: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
ad10: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
ad20: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
ad30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
ad40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
ad50: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
ad60: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
ad70: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
ad80: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
ad90: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
ada0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
adb0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
adc0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
add0: 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
ade0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
adf0: 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
ae00: 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
ae10: 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
ae20: 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
ae30: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
ae40: 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
ae50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
ae60: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
ae70: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
ae80: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
ae90: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
aea0: 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
aeb0: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
aec0: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
aed0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
aee0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
aef0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
af00: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
af10: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
af20: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
af30: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
af40: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
af50: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
af60: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
af70: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
af80: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
af90: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
afa0: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
afb0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
afc0: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
afd0: 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
afe0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
aff0: 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
b000: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
b010: 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
b020: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
b030: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
b040: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
b050: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
b060: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b070: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
b080: 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
b090: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
b0a0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
b0b0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
b0c0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
b0d0: 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
b0e0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20  nd_lock;.  }... 
b0f0: 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
b100: 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
b110: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
b120: 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
b130: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
b140: 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
b150: 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
b160: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
b170: 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
b180: 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
b190: 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  ..  */.  lock.l_
b1a0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b  len = 1L;.  lock
b1b0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b1c0: 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c  _SET;.  if( eFil
b1d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
b1e0: 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
b1f0: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
b200: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
b210: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
b220: 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
b230: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b240: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
b250: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
b260: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
b270: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
b280: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
b290: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  s = osFcntl(pFil
b2a0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
b2b0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
b2c0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
b2d0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
b2e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b2f0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
b300: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
b310: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
b320: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
b330: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
b340: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b350: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
b360: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
b370: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b380: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
b390: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
b3a0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
b3b0: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
b3c0: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
b3d0: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
b3e0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
b3f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
b400: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
b410: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
b420: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
b430: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
b440: 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
b450: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
b460: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  FileLock==0 );..
b470: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
b480: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
b490: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b4a0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
b4b0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
b4c0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
b4d0: 20 20 20 69 66 28 20 28 73 20 3d 20 6f 73 46 63     if( (s = osFc
b4e0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
b4f0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d  SETLK, &lock))==
b500: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45  (-1) ){.      tE
b510: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b520: 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
b530: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
b540: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
b550: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b560: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
b570: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
b580: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
b590: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
b5a0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
b5b0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b5c0: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
b5d0: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
b5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
b5f0: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
b600: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
b610: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
b620: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
b630: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
b640: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b650: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b660: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
b670: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
b680: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
b690: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
b6a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
b6b0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
b6c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b6d0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
b6e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b6f0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
b700: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b710: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
b720: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
b730: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
b740: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
b750: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
b760: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b770: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
b780: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
b790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
b7a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
b7b0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
b7c0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
b7d0: 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
b7e0: 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
b7f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
b800: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
b810: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
b820: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
b830: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
b840: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
b850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
b860: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
b870: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
b880: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
b890: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
b8a0: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
b8b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
b8c0: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
b8d0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
b8e0: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
b8f0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
b900: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
b910: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
b920: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
b930: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
b940: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
b950: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
b960: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b970: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
b980: 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f  leLock );.    lo
b990: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
b9a0: 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28  LCK;.    switch(
b9b0: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
b9c0: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
b9d0: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
b9e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
b9f0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
ba00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba10: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
ba20: 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  E_LOCK:.        
ba30: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ba40: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ba50: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ba60: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
ba70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ba80: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
ba90: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
baa0: 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 6f 73      }.    s = os
bab0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
bac0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
bad0: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
bae0: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
baf0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
bb00: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
bb10: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
bb20: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
bb30: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
bb40: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
bb50: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
bb60: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
bb70: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
bb80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
bb90: 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   ..#ifndef NDEBU
bba0: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
bbb0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
bbc0: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
bbd0: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
bbe0: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
bbf0: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
bc00: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
bc10: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
bc20: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
bc30: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
bc40: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
bc50: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
bc60: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
bc70: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
bc80: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
bc90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
bca0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
bcb0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
bcc0: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  k<=SHARED_LOCK. 
bcd0: 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d    && eFileLock==
bce0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
bcf0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
bd00: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
bd10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
bd20: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
bd30: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
bd40: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
bd50: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
bd60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bd70: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
bd80: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
bd90: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
bda0: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
bdb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
bdc0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
bdd0: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
bde0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
bdf0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
be00: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
be10: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
be20: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
be30: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
be40: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
be50: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
be60: 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20  s %s (unix)\n", 
be70: 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
be80: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
be90: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
bea0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
beb0: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
bec0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bed0: 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65   Add the file de
bee0: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79  scriptor used by
bef0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69   file handle pFi
bf00: 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73  le to the corres
bf10: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73  ponding.** pUnus
bf20: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ed list..*/.stat
bf30: 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69  ic void setPendi
bf40: 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  ngFd(unixFile *p
bf50: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
bf60: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
bf70: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
bf80: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
bf90: 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  p = pFile->pUnus
bfa0: 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ed;.  p->pNext =
bfb0: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
bfc0: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
bfd0: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
bfe0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
bff0: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
c000: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
c010: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
c020: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
c030: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
c040: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
c050: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
c060: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
c070: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
c080: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
c090: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
c0a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
c0b0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
c0c0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
c0d0: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
c0e0: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
c0f0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
c100: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
c110: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
c120: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
c130: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
c140: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
c150: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
c160: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
c170: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
c180: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
c190: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
c1a0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
c1b0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
c1c0: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
c1d0: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
c1e0: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
c1f0: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
c200: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
c210: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
c220: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
c230: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
c240: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
c250: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
c260: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
c270: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
c280: 69 6e 74 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  int _posixUnlock
c290: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
c2a0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
c2b0: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
c2c0: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
c2d0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c2e0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
c2f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
c300: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
c310: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
c320: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c330: 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74 45   int h;.  int tE
c340: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
c350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
c360: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
c370: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
c380: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
c390: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
c3a0: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
c3b0: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
c3c0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
c3d0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
c3e0: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
c3f0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
c400: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
c410: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
c420: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
c430: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
c440: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
c450: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
c460: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
c470: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
c480: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
c490: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c4a0: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
c4b0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d  erMutex();.  h =
c4c0: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e   pFile->h;.  pIn
c4d0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
c4e0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
c4f0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
c500: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
c510: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
c520: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
c530: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
c540: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
c550: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
c560: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
c570: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
c580: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
c590: 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
c5a0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
c5b0: 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66  ign(0);..#ifndef
c5c0: 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
c5d0: 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
c5e0: 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
c5f0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
c600: 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
c610: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
c620: 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
c630: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
c640: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
c650: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
c660: 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
c670: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
c680: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
c690: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
c6a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
c6b0: 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
c6c0: 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
c6d0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
c6e0: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
c6f0: 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
c700: 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
c710: 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
c720: 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
c730: 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
c740: 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
c750: 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
c760: 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
c770: 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
c780: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
c790: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ion..    */.#if 
c7a0: 30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  0.    assert( pF
c7b0: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
c7c0: 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  te==0.         |
c7d0: 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
c7e0: 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  e==0.         ||
c7f0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
c800: 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64  rChng==1 );.#end
c810: 69 66 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  if.    pFile->in
c820: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
c830: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
c840: 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
c850: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
c860: 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
c870: 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
c880: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
c890: 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
c8a0: 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
c8b0: 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
c8c0: 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
c8d0: 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
c8e0: 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
c8f0: 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
c900: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
c910: 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
c920: 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
c930: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
c940: 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
c950: 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
c960: 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
c970: 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
c980: 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
c990: 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
c9a0: 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
c9b0: 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
c9c0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
c9d0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66  RED_LOCK ){..#if
c9e0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
c9f0: 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
ca00: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
ca10: 54 59 4c 45 0a 20 20 20 20 20 20 61 73 73 65 72  TYLE.      asser
ca20: 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
ca30: 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
ca40: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
ca50: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
ca60: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
ca70: 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
ca80: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
ca90: 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  ){.        off_t
caa0: 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
cab0: 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
cac0: 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
cad0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
cae0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
caf0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
cb00: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
cb10: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
cb20: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
cb30: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
cb40: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
cb50: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 68 2c 20   if( osFcntl(h, 
cb60: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
cb70: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
cb80: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
cb90: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
cba0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
cbb0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
cbc0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
cbd0: 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _UNLOCK);.      
cbe0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
cbf0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
cc00: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
cc10: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
cc20: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
cc30: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
cc40: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
cc50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
cc60: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
cc70: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
cc80: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
cc90: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
cca0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
ccb0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
ccc0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ccd0: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
cce0: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 68 2c 20   if( osFcntl(h, 
ccf0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
cd00: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
cd10: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
cd20: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
cd30: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
cd40: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
cd50: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
cd60: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
cd70: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
cd80: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
cd90: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
cda0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
cdb0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
cdc0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
cdd0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
cde0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
cdf0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ce00: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
ce10: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ce20: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
ce30: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
ce40: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
ce50: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
ce60: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ce70: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
ce80: 20 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c       if( osFcntl
ce90: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
cea0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
ceb0: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
cec0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
ced0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
cee0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
cef0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
cf00: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
cf10: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
cf20: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
cf30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
cf40: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
cf50: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
cf60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
cf70: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
cf80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cf90: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64  else.#endif /* d
cfa0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
cfb0: 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
cfc0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
cfd0: 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
cfe0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
cff0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
d000: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d010: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d020: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d030: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d040: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
d050: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
d060: 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ZE;.        if( 
d070: 6f 73 46 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  osFcntl(h, F_SET
d080: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
d090: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
d0a0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d0b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d0c0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
d0d0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
d0e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
d0f0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
d100: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
d110: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
d120: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d130: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d140: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d150: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
d160: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
d170: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d180: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d190: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
d1a0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d1b0: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
d1c0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
d1d0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
d1e0: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
d1f0: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
d200: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
d210: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  YTE );.    if( o
d220: 73 46 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c  sFcntl(h, F_SETL
d230: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20  K, &lock)!=(-1) 
d240: 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
d250: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
d260: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
d270: 6c 73 65 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  lse{.      tErrn
d280: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d290: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
d2a0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
d2b0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
d2c0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
d2d0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
d2e0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
d2f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d300: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d320: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
d330: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
d340: 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
d350: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
d360: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
d370: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
d380: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
d390: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
d3a0: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
d3b0: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
d3c0: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
d3d0: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
d3e0: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
d3f0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
d400: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
d410: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
d420: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
d430: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d440: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
d450: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d460: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d470: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d480: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
d490: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
d4a0: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
d4b0: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
d4c0: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
d4d0: 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
d4e0: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
d4f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 63  ;.      if( osFc
d500: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d510: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
d520: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
d530: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
d540: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
d550: 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f  {.        tErrno
d560: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
d580: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
d590: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
d5a0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
d5b0: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
d5c0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
d5d0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
d5e0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
d5f0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rno;.        }. 
d600: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
d610: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
d620: 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
d630: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
d640: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
d650: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
d660: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
d670: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
d680: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
d690: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
d6a0: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
d6b0: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
d6c0: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
d6d0: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
d6e0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
d6f0: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
d700: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
d710: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
d720: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
d730: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
d740: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
d750: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
d760: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
d770: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
d780: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
d790: 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c   }.  }...end_unl
d7a0: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
d7b0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
d7c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
d7d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d7e0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
d7f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d800: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
d810: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
d820: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
d830: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
d840: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
d850: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
d860: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
d870: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
d880: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
d890: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
d8a0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
d8b0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
d8c0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
d8d0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
d8e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d8f0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
d900: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
d910: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
d920: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
d930: 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f  k){.  return _po
d940: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
d950: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
d960: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d970: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
d980: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
d990: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
d9a0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
d9b0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
d9c0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
d9d0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
d9e0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
d9f0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
da00: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
da10: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
da20: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
da30: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
da40: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
da50: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
da60: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
da70: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
da80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
da90: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
daa0: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
dab0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
dac0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
dad0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
dae0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
daf0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
db00: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
db10: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
db20: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
db30: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
db40: 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20   if( pFile ){.  
db50: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
db60: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fd>=0 ){.      r
db70: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
db80: 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  e, pFile->dirfd,
db90: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
dba0: 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d 2d    pFile->dirfd=-
dbb0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
dbc0: 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
dbd0: 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
dbe0: 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
dbf0: 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
dc00: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
dc10: 2d 31 3b 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53  -1;.    }.#if OS
dc20: 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28  _VXWORKS.    if(
dc30: 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
dc40: 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
dc50: 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  isDelete ){.    
dc60: 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65      unlink(pFile
dc70: 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
dc80: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  lName);.      }.
dc90: 20 20 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c        vxworksRel
dca0: 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65  easeFileId(pFile
dcb0: 2d 3e 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46  ->pId);.      pF
dcc0: 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20  ile->pId = 0;.  
dcd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f    }.#endif.    O
dce0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20  STRACE(("CLOSE  
dcf0: 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
dd00: 3e 68 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  >h));.    OpenCo
dd10: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73  unter(-1);.    s
dd20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
dd30: 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20  e->pUnused);.   
dd40: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
dd50: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
dd60: 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  e));.  }.  retur
dd70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dd80: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
dd90: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
dda0: 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  t unixClose(sqli
ddb0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
ddc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ddd0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
dde0: 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
ddf0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
de00: 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55   *)id;.    unixU
de10: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
de20: 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  K);.    unixEnte
de30: 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
de40: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
de50: 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
de60: 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
de70: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
de80: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
de90: 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
dea0: 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
deb0: 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
dec0: 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
ded0: 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
dee0: 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
def0: 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
df00: 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
df10: 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
df20: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
df30: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
df40: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
df50: 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
df60: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
df70: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
df80: 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
df90: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
dfa0: 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e   }.    releaseIn
dfb0: 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
dfc0: 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
dfd0: 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
dfe0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
dff0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
e000: 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
e010: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
e020: 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
e030: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
e040: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
e050: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
e060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0a0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
e0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0f0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
e100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e110: 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b  ***** No-op Lock
e120: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
e130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e140: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20  ******.**.** Of 
e150: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
e160: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
e170: 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74  ons available, t
e180: 68 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68  his is by far th
e190: 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20  e.** simplest:  
e1a0: 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72  locking is ignor
e1b0: 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20  ed.  No attempt 
e1c0: 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20  is made to lock 
e1d0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
e1e0: 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
e1f0: 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   or writing..**.
e200: 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20  ** This locking 
e210: 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69  mode is appropri
e220: 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72  ate for use on r
e230: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
e240: 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62  es.** (ex: datab
e250: 61 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75  ases that are bu
e260: 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d  rned into CD-ROM
e270: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20  , for example.) 
e280: 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20   It can.** also 
e290: 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61  be used if the a
e2a0: 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f  pplication emplo
e2b0: 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c  ys some external
e2c0: 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a   mechanism to.**
e2d0: 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61   prevent simulta
e2e0: 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20  neous access of 
e2f0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
e300: 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e by two or more
e310: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
e320: 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  nections.  But t
e330: 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75  here is a seriou
e340: 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61  s risk of databa
e350: 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  se.** corruption
e360: 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   if this locking
e370: 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e   mode is used in
e380: 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72   situations wher
e390: 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61  e multiple.** da
e3a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e3b0: 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67  ns are accessing
e3c0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
e3d0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
e3e0: 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20  ame.** time and 
e3f0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
e400: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hose connections
e410: 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f   are writing..*/
e420: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
e430: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
e440: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
e450: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
e460: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55  *pResOut){.  UNU
e470: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
e480: 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f  tUsed);.  *pResO
e490: 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
e4a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
e4b0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c  atic int nolockL
e4c0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e4d0: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
e4e0: 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
e4f0: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
e500: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
e510: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e520: 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
e530: 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  nt nolockUnlock(
e540: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
e550: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
e560: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
e570: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
e580: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
e590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e5a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
e5b0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
e5c0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
e5d0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
e5e0: 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72  e *id) {.  retur
e5f0: 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
e600: 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  id);.}../*******
e610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
e620: 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f   of the no-op lo
e630: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
e640: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
e650: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
e660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6a0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
e6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
e700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e710: 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c  ** Begin dot-fil
e720: 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
e730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e740: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
e750: 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  he dotfile locki
e760: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
e770: 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74  n uses the exist
e780: 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65  ance of separate
e790: 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69   lock.** files i
e7a0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72  n order to contr
e7b0: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
e7c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
e7d0: 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a   works on just.*
e7e0: 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69  * about every fi
e7f0: 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61  lesystem imagina
e800: 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20  ble.  But there 
e810: 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e  are serious down
e820: 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  sides:.**.**    
e830: 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65  (1)  There is ze
e840: 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20  ro concurrency. 
e850: 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72   A single reader
e860: 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65   blocks all othe
e870: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e  r.**         con
e880: 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65  nections from re
e890: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
e8a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
e8b0: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20  *.**    (2)  An 
e8c0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73  application cras
e8d0: 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20  h or power loss 
e8e0: 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20  can leave stale 
e8f0: 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20  lock files.**   
e900: 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72        sitting ar
e910: 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74  ound that need t
e920: 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e  o be cleared man
e930: 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76  ually..**.** Nev
e940: 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74  ertheless, a dot
e950: 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f  lock is an appro
e960: 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
e970: 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e  ode for use if n
e980: 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  o.** other locki
e990: 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61  ng strategy is a
e9a0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
e9b0: 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
e9c0: 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e  works by creatin
e9d0: 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20  g a file in the 
e9e0: 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
e9f0: 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  s the.** databas
ea00: 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73  e and with the s
ea10: 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74  ame name but wit
ea20: 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65  h a ".lock" exte
ea30: 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20  nsion added..** 
ea40: 54 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  The existance of
ea50: 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70   a lock file imp
ea60: 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56  lies an EXCLUSIV
ea70: 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68  E lock.  All oth
ea80: 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73  er lock.** types
ea90: 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56   (SHARED, RESERV
eaa0: 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65  ED, PENDING) are
eab0: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43   mapped into EXC
eac0: 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  LUSIVE..*/../*.*
ead0: 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
eae0: 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  x added to the d
eaf0: 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d  ata base filenam
eb00: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
eb10: 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  eate the.** lock
eb20: 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e   file..*/.#defin
eb30: 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  e DOTLOCK_SUFFIX
eb40: 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20   ".lock"../*.** 
eb50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
eb60: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
eb70: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
eb80: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
eb90: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
eba0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
ebb0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
ebc0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
ebd0: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
ebe0: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
ebf0: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
ec00: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
ec10: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
ec20: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
ec30: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
ec40: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
ec50: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
ec60: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
ec70: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f  ing..**.** In do
ec80: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65  tfile locking, e
ec90: 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69  ither a lock exi
eca0: 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e  sts or it does n
ecb0: 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a  ot.  So in this.
ecc0: 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20  ** variation of 
ecd0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
ece0: 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73  k(), *pResOut is
ecf0: 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
ed00: 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68  any lock.** is h
ed10: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  eld on the file 
ed20: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
ed30: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
ed40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ed50: 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
ed60: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
ed70: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
ed80: 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
ed90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
eda0: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
edb0: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
edc0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
edd0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
ede0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
edf0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
ee00: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
ee10: 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
ee20: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
ee30: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
ee40: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
ee50: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
ee60: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
ee70: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ee80: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
ee90: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
eea0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
eeb0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
eec0: 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
eed0: 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
eee0: 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
eef0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
ef00: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
ef10: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
ef20: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
ef30: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
ef40: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
ef50: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
ef60: 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
ef70: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
ef80: 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
ef90: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
efa0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
efb0: 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
efc0: 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b  = osAccess(zLock
efd0: 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d  File, 0)==0;.  }
efe0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
eff0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
f000: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
f010: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
f020: 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52  eserved));.  *pR
f030: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
f040: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f050: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
f060: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
f070: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
f080: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
f090: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
f0a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
f0b0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
f0c0: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
f0d0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
f0e0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
f0f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
f100: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
f110: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
f120: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
f130: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
f140: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
f150: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
f160: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
f170: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
f180: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
f190: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
f1a0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
f1b0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
f1c0: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
f1d0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
f1e0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
f1f0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
f200: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
f210: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
f220: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
f230: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
f240: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
f250: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
f260: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
f270: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
f280: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
f290: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
f2a0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
f2b0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f2c0: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
f2d0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
f2e0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
f2f0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
f300: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
f310: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
f320: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
f330: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
f340: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
f350: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
f360: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
f370: 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f  l..**.** With do
f380: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77  tfile locking, w
f390: 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75  e really only su
f3a0: 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a  pport state (4):
f3b0: 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42   EXCLUSIVE..** B
f3c0: 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20  ut we track the 
f3d0: 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65  other locking le
f3e0: 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  vels internally.
f3f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
f400: 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  otlockLock(sqlit
f410: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f420: 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
f430: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f440: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f450: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61  .  int fd;.  cha
f460: 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
f470: 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
f480: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
f490: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f4a0: 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65  OK;...  /* If we
f4b0: 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20   have any lock, 
f4c0: 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69  then the lock fi
f4d0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
f4e0: 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a  s.  All we have.
f4f0: 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64    ** to do is ad
f500: 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61  just our interna
f510: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  l record of the 
f520: 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f  lock level..  */
f530: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
f540: 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
f550: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f560: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f570: 65 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f 53 5f 56  eLock;.#if !OS_V
f580: 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c  XWORKS.    /* Al
f590: 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
f5a0: 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
f5b0: 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20   old file */.   
f5c0: 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
f5d0: 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
f5e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f5f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
f600: 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
f610: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66  sive lock */.  f
f620: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 4c 6f 63 6b  d = osOpen(zLock
f630: 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  File,O_RDONLY|O_
f640: 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30  CREAT|O_EXCL,060
f650: 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  0);.  if( fd<0 )
f660: 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
f670: 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
f680: 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65  he file, someone
f690: 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73   else may have s
f6a0: 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a  tolen the lock *
f6b0: 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  /.    int tErrno
f6c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
f6d0: 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72  ( EEXIST == tErr
f6e0: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
f6f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f700: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
f710: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
f720: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f730: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
f740: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
f750: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
f760: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
f770: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f780: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
f790: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f7a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a  return rc;.  } .
f7b0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
f7c0: 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  File, fd, __LINE
f7d0: 5f 5f 29 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f 74  __);.  .  /* got
f7e0: 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
f7f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
f800: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
f810: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
f820: 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
f830: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
f840: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
f850: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
f860: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
f870: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
f880: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
f890: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
f8a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
f8b0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
f8c0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
f8d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
f8e0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
f8f0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
f900: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
f910: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
f920: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
f930: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f  *.** When the lo
f940: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63  cking level reac
f950: 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c  hes NO_LOCK, del
f960: 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
f970: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f980: 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73   dotlockUnlock(s
f990: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f9a0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
f9b0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f9c0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f9d0: 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
f9e0: 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
f9f0: 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
fa00: 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  ontext;..  asser
fa10: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
fa20: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
fa30: 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
fa40: 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22  =%d (dotlock)\n"
fa50: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
fa60: 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65  eLock,..   pFile
fa70: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
fa80: 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
fa90: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
faa0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
fab0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
fac0: 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
fad0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
fae0: 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
faf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fb00: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
fb10: 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
fb20: 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
fb30: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
fb40: 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
fb50: 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
fb60: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
fb70: 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
fb80: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
fb90: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
fba0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fbb0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
fbc0: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
fbd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fbe0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
fbf0: 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
fc00: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
fc10: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
fc20: 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
fc30: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
fc40: 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  O_LOCK );.  if( 
fc50: 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65  unlink(zLockFile
fc60: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  ) ){.    int rc 
fc70: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72  = 0;.    int tEr
fc80: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
fc90: 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
fca0: 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
fcb0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
fcc0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
fcd0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
fce0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
fcf0: 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
fd00: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
fd10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
fd20: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
fd30: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
fd40: 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
fd50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
fd60: 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
fd70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fd80: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
fd90: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
fda0: 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
fdb0: 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
fdc0: 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
fdd0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
fde0: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
fdf0: 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
fe00: 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
fe10: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fe20: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fe30: 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e  d;.    dotlockUn
fe40: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
fe50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
fe60: 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
fe70: 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
fe80: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
fe90: 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75  File(id);.  retu
fea0: 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn rc;.}./******
feb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
fec0: 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
fed0: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
fee0: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
fef0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
ff50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
ffa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffb0: 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
ffc0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
fff0: 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
10000 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
10010 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
10020 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
10030 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
10040 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
10050 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
10060 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
10070 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
10080 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
10090 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
100a0 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
100b0 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
100c0 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
100d0 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
100e0 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
100f0 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
10100 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
10110 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
10120 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
10130 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
10140 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
10150 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
10160 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
10170 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
10180 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
10190 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
101a0 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
101b0 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
101c0 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
101d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
101e0 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
101f0 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70  ff or if.** comp
10200 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b  iling for VXWORK
10210 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  S..*/.#if SQLITE
10220 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10230 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
10240 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  ORKS../*.** Retr
10250 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
10260 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
10270 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
10280 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
10290 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
102a0 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
102b0 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
102c0 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
102d0 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
102e0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
102f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10300 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
10310 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
10320 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
10330 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
10340 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10350 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
10360 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
10370 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
10380 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
10390 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
103a0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
103b0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
103c0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
103d0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
103e0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
103f0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
10400 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
10410 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
10420 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
10430 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
10440 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
10450 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
10460 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
10470 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
10480 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
10490 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
104a0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
104b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
104c0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
104d0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
104e0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
104f0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
10500 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
10510 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10520 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
10530 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
10540 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10550 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
10560 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
10570 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
10580 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
10590 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
105a0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
105b0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
105c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
105d0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
105e0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
105f0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
10600 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
10610 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
10620 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
10630 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
10640 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
10650 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
10660 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
10670 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
10680 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
10690 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
106a0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
106b0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
106c0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
106d0 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
106e0 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
106f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10700 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
10710 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
10720 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
10730 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
10740 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
10750 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10760 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20  _IOERR_UNLOCK); 
10770 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
10780 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
10790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
107a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
107b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
107c0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
107d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
107e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
107f0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10800 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
10810 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
10820 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
10830 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
10840 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
10850 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10860 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10870 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10880 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
10890 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
108a0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
108b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
108c0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
108d0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
108e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
108f0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
10900 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
10910 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
10920 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
10930 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
10940 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
10950 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
10960 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
10970 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
10980 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
10990 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
109a0 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
109b0 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
109c0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
109d0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
109e0 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
109f0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
10a00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10a10 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
10a20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
10a30 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
10a40 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
10a50 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
10a60 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
10a70 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
10a80 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
10a90 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
10aa0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
10ab0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
10ac0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
10ad0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
10ae0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
10af0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
10b00 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
10b10 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
10b20 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
10b30 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
10b40 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
10b50 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
10b60 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
10b70 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
10b80 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
10b90 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
10ba0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
10bb0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
10bc0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
10bd0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
10be0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
10bf0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
10c00 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
10c10 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
10c20 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
10c30 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
10c40 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
10c50 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
10c60 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
10c70 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
10c80 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
10c90 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10ca0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
10cb0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
10cc0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
10cd0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
10ce0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
10cf0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
10d00 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
10d10 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
10d20 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
10d30 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
10d40 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
10d50 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
10d60 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
10d70 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
10d80 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
10d90 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
10da0 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
10db0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
10dc0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
10dd0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
10de0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
10df0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
10e00 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
10e10 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
10e20 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
10e30 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10e40 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
10e50 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
10e60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
10e70 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10e80 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
10e90 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10ea0 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
10eb0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
10ec0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
10ed0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
10ee0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
10ef0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
10f00 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
10f10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
10f20 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
10f30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10f40 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
10f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10f60 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
10f70 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
10f80 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
10f90 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f (robust_flock(
10fa0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
10fb0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
10fc0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10fd0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
10fe0 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
10ff0 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
11000 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
11010 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11020 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11030 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
11040 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11050 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
11060 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11070 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
11080 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
11090 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
110a0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
110b0 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
110c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
110d0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
110e0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
110f0 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
11100 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
11110 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
11120 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
11130 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
11140 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
11150 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
11160 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
11170 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
11180 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
11190 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
111a0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
111b0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
111c0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
111d0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
111e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
111f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11200 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
11210 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
11220 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
11230 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
11240 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
11250 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
11260 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
11270 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
11280 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
11290 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
112a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
112b0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
112c0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
112d0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
112e0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
112f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
11300 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11310 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
11320 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11330 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
11340 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11350 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
11360 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11370 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
11380 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
11390 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63   %d pid=%d (floc
113a0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
113b0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
113c0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
113d0 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
113e0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
113f0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
11400 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
11410 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
11420 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
11430 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
11440 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
11450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11460 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
11470 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
11480 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
11490 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
114a0 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
114b0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
114c0 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
114d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
114e0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
114f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11500 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
11510 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
11520 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  k. */.  int rc =
11530 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
11540 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
11550 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20  ;.  if (rc) {.  
11560 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20    int r, tErrno 
11570 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d  = errno;.    r =
11580 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11590 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
115a0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
115b0 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
115c0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
115d0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
115e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
115f0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64  rrno;.    }.#ifd
11600 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
11610 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11620 52 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20  RS.    if( (r & 
11630 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
11640 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
11650 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54  .      r = SQLIT
11660 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65  E_BUSY;.    }.#e
11670 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
11680 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
11690 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a  _ERRORS */.    .
116a0 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20      return r;.  
116b0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69  } else {.    pFi
116c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
116d0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
116e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
116f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
11700 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
11710 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
11720 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11730 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
11740 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f  ){.    flockUnlo
11750 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
11760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c  .  }.  return cl
11770 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
11780 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
11790 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
117a0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
117b0 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a  _VXWORK */../***
117c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117d0 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63   End of the floc
117e0 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  k lock implement
117f0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
11860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
118b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118c0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65  ***** Begin Name
118d0 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b  d Semaphore Lock
118e0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
118f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
11900 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
11910 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
11920 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
11930 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53  VxWorks..**.** S
11940 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
11950 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63   is like dot-loc
11960 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74  k and flock in t
11970 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e  hat it really on
11980 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45  ly.** supports E
11990 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67  XCLUSIVE locking
119a0 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  .  Only a single
119b0 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61   process can rea
119c0 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68  d or write.** th
119d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
119e0 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
119f0 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69   reduces potenti
11a00 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20  al concurrency, 
11a10 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  but.** makes the
11a20 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
11a30 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72  tion much easier
11a40 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ..*/.#if OS_VXWO
11a50 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
11a60 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
11a70 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
11a80 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
11a90 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
11aa0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
11ab0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
11ac0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
11ad0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
11ae0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
11af0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
11b00 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
11b10 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
11b20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
11b30 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
11b40 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
11b50 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
11b60 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11b70 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
11b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
11b90 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
11ba0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11bb0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
11bc0 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
11bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
11be0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
11bf0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11c00 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11c10 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
11c20 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
11c30 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
11c40 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
11c50 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
11c60 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
11c70 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
11c80 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
11c90 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
11ca0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11cb0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
11cc0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
11cd0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
11ce0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
11cf0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
11d00 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
11d10 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
11d20 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73  eserved ){.    s
11d30 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
11d40 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
11d50 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
11d60 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20  t statBuf;..    
11d70 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
11d80 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
11d90 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11da0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
11db0 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e   EAGAIN != tErrn
11dc0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
11dd0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11de0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11df0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11e00 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
11e10 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69  CK);.        pFi
11e20 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11e30 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20  tErrno;.      } 
11e40 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
11e50 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
11e60 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
11e70 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
11e80 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
11e90 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
11ea0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41  >eFileLock < SHA
11eb0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
11ec0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11ed0 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20      /* we could 
11ee0 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
11ef0 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73  nt it */.      s
11f00 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20  em_post(pSem);. 
11f10 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
11f20 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11f30 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29  K %d %d %d (sem)
11f40 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
11f50 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
11f60 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
11f70 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
11f80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
11f90 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
11fa0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
11fb0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
11fc0 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
11fd0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
11fe0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
11ff0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12000 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12010 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12020 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
12030 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12040 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12050 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12060 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12070 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12080 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12090 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
120a0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
120b0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
120c0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
120d0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
120e0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
120f0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12100 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12110 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
12120 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
12130 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12140 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12150 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12160 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12170 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12180 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12190 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
121a0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
121b0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
121c0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
121d0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
121e0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
121f0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
12200 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
12210 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
12220 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
12230 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
12240 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
12250 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
12260 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
12270 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
12280 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
12290 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
122a0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
122b0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
122c0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
122d0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
122e0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
122f0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
12300 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
12310 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
12320 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
12330 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12340 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
12350 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
12360 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
12370 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
12380 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
12390 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
123a0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f  static int semLo
123b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
123c0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
123d0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
123e0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
123f0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66  ile*)id;.  int f
12400 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
12410 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
12420 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63  ->pSem;.  int rc
12430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
12440 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
12450 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
12460 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
12470 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
12480 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
12490 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
124a0 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
124b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
124c0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
124d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
124e0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63  FileLock;.    rc
124f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12500 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
12510 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
12520 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
12530 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
12540 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
12550 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
12560 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
12570 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
12580 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12590 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
125a0 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
125b0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
125c0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
125d0 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
125e0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
125f0 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ock;.. sem_end_l
12600 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
12610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
12620 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12630 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
12640 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
12650 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
12660 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
12670 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
12680 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
12690 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
126a0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
126b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
126c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
126d0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
126e0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
126f0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
12700 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
12710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12720 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  emUnlock(sqlite3
12730 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12740 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
12750 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12760 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12770 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
12780 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
12790 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
127a0 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
127b0 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52  ( pSem );.  OSTR
127c0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
127d0 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
127e0 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
127f0 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
12800 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ..   pFile->eFil
12810 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
12820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
12830 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
12840 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
12850 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
12860 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12870 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
12880 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
12890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
128a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
128b0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
128c0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
128d0 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
128e0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
128f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12900 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
12910 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12920 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
12930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12940 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
12950 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20   really unlock. 
12960 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f  */.  if ( sem_po
12970 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b  st(pSem)==-1 ) {
12980 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72  .    int rc, tEr
12990 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
129a0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
129b0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
129c0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
129d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
129e0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
129f0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
12a00 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12a10 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
12a20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
12a30 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65   .  }.  pFile->e
12a40 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
12a50 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
12a60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ITE_OK;.}../*. *
12a70 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
12a80 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73   */.static int s
12a90 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  emClose(sqlite3_
12aa0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
12ab0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
12ac0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12ad0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
12ae0 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   semUnlock(id, N
12af0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73  O_LOCK);.    ass
12b00 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12b10 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
12b20 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49  ();.    releaseI
12b30 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
12b40 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
12b50 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65  tex();.    close
12b60 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
12b70 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12b80 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
12b90 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
12ba0 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  ./*.** Named sem
12bb0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
12bc0 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
12bd0 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
12be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12bf0 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  End of the named
12c00 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20   semaphore lock 
12c10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
12c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
12c80 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cd0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
12ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
12cf0 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20  gin AFP Locking 
12d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d20 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74  *.**.** AFP is t
12d30 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20  he Apple Filing 
12d40 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69  Protocol.  AFP i
12d50 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  s a network file
12d60 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20  system found.** 
12d70 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f  on Apple Macinto
12d80 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62  sh computers - b
12d90 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e  oth OS9 and OSX.
12da0 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72  .**.** Third-par
12db0 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ty implementatio
12dc0 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76  ns of AFP are av
12dd0 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ailable.  But th
12de0 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  is code here.** 
12df0 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53  only works on OS
12e00 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  X..*/..#if defin
12e10 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
12e20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
12e30 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
12e40 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** The afpLockin
12e50 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  gContext structu
12e60 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  re contains all 
12e70 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  afp lock specifi
12e80 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64  c state.*/.typed
12e90 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63  ef struct afpLoc
12ea0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c  kingContext afpL
12eb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
12ec0 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
12ed0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20  Context {.  int 
12ee0 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73  reserved;.  cons
12ef0 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20  t char *dbPath; 
12f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12f10 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
12f20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75  file */.};..stru
12f30 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
12f40 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  PB2.{.  unsigned
12f50 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
12f60 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  t;        /* off
12f70 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
12f80 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  e to lock */.  u
12f90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
12fa0 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  g length;       
12fb0 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73   /* nbr of bytes
12fc0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
12fd0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
12fe0 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20   retRangeStart; 
12ff0 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79  /* nbr of 1st by
13000 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63  te locked if suc
13010 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73  cessful */.  uns
13020 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63  igned char unLoc
13030 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f  kFlag;         /
13040 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20  * 1 = unlock, 0 
13050 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  = lock */.  unsi
13060 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45  gned char startE
13070 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  ndFlag;       /*
13080 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66   1=rel to end of
13090 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20   fork, 0=rel to 
130a0 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66  start */.  int f
130b0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130d0 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73  file desc to ass
130e0 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74  oc this lock wit
130f0 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  h */.};..#define
13100 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
13110 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20  ock2FSCTL       
13120 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
13130 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
13140 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20  LockPB2)../*.** 
13150 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
13160 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72  y for setting or
13170 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d   clearing a bit-
13180 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e  range lock on an
13190 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74  .** AFP filesyst
131a0 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72  em..** .** Retur
131b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
131c0 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42  uccess, SQLITE_B
131d0 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  USY on failure..
131e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
131f0 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73  pSetLock(.  cons
13200 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
13210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
13220 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  me of the file t
13230 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75  o be locked or u
13240 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69  nlocked */.  uni
13250 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
13260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13270 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
13280 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20  tor on path */. 
13290 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
132a0 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20  ong offset,     
132b0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f  /* First byte to
132c0 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
132d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
132e0 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f  ng length,     /
132f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13300 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  s to lock */.  i
13310 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20  nt setLockFlag  
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13330 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63   True to set loc
13340 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65  k.  False to cle
13350 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ar lock */.){.  
13360 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
13370 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e  LockPB2 pb;.  in
13380 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75  t err;.  .  pb.u
13390 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c  nLockFlag = setL
133a0 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b  ockFlag ? 0 : 1;
133b0 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c  .  pb.startEndFl
133c0 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66  ag = 0;.  pb.off
133d0 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  set = offset;.  
133e0 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67  pb.length = leng
133f0 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70  th; .  pb.fd = p
13400 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53  File->h;.  .  OS
13410 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
13420 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73  CK [%s] for %d%s
13430 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25   in range %llx:%
13440 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65  llx\n", .    (se
13450 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22  tLockFlag?"ON":"
13460 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c  OFF"), pFile->h,
13470 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65   (pb.fd==-1?"[te
13480 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20  stval-1]":""),. 
13490 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74     offset, lengt
134a0 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63  h));.  err = fsc
134b0 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79  tl(path, afpfsBy
134c0 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
134d0 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66  L, &pb, 0);.  if
134e0 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20   ( err==-1 ) {. 
134f0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
13500 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13510 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  o;.    OSTRACE((
13520 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c  "AFPSETLOCK fail
13530 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25  ed to fsctl() '%
13540 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  s' %d %s\n",.   
13550 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20            path, 
13560 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72  tErrno, strerror
13570 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64  (tErrno)));.#ifd
13580 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
13590 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
135a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
135b0 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20  _BUSY;.#else.   
135c0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
135d0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
135e0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
135f0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c              setL
13600 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45  ockFlag ? SQLITE
13610 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51  _IOERR_LOCK : SQ
13620 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13630 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  K);.#endif /* SQ
13640 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
13650 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13660 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13670 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
13680 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13690 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
136a0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
136b0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
136c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
136d0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
136e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
136f0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13700 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13710 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13720 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13730 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13740 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13750 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13760 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
13770 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
13780 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
13790 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
137a0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
137b0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
137c0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
137d0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
137e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
137f0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13800 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
13810 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  nt afpCheckReser
13820 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
13830 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13840 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
13850 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13860 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
13870 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
13880 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13890 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
138a0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
138b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
138c0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
138d0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
138e0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66  t( pFile );.  af
138f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13900 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
13910 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
13920 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
13930 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
13940 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
13950 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
13960 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
13970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13980 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
13990 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
139a0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
139b0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
139c0 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
139d0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
139e0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
139f0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13a00 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13a10 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
13a20 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
13a30 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
13a40 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
13a50 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
13a60 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
13a70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
13a80 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
13a90 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
13aa0 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
13ab0 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
13ac0 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
13ad0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13ae0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
13af0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
13b00 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
13b10 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
13b20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
13b30 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
13b40 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
13b50 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
13b60 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
13b70 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
13b80 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
13b90 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
13ba0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
13bb0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
13bc0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
13bd0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
13be0 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
13bf0 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
13c00 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
13c10 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
13c20 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
13c30 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
13c40 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
13c50 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
13c60 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
13c70 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
13c80 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
13c90 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
13ca0 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
13cb0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
13cc0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
13cd0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
13ce0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
13cf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13d00 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
13d10 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
13d20 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
13d30 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
13d40 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
13d50 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
13d60 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
13d70 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
13d80 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
13d90 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
13da0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
13db0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
13dc0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
13dd0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
13de0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
13df0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
13e00 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
13e10 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
13e20 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
13e30 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
13e40 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
13e50 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
13e60 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
13e70 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
13e80 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
13e90 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
13ea0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
13eb0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
13ec0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
13ed0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
13ee0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
13ef0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
13f00 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
13f10 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
13f20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
13f30 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
13f40 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13f50 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
13f60 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
13f70 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
13f80 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13f90 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
13fa0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
13fb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13fc0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
13fd0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
13fe0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
13ff0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
14000 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
14010 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
14020 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
14030 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14040 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
14050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14060 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
14070 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14080 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
14090 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
140a0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
140b0 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
140c0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
140d0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
140e0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
140f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
14100 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
14110 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
14120 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
14130 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
14140 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
14150 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
14160 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
14170 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
14180 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
14190 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
141a0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
141b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
141c0 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
141d0 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
141e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
141f0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
14200 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
14210 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
14220 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
14230 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
14240 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
14250 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
14260 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
14270 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
14280 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
14290 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
142a0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
142b0 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
142c0 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
142d0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
142e0 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
142f0 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
14300 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
14310 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
14320 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
14330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14340 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
14350 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
14360 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
14370 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
14380 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
14390 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
143a0 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
143b0 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
143c0 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
143d0 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
143e0 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
143f0 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
14400 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
14410 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
14420 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
14430 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
14440 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
14450 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
14460 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
14470 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
14480 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
14490 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
144a0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
144b0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
144c0 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
144d0 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
144e0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
144f0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
14500 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
14510 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
14520 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
14530 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
14540 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
14550 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
14560 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
14570 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
14580 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
14590 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
145a0 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
145b0 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
145c0 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
145d0 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
145e0 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
145f0 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
14600 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
14610 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
14620 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
14630 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
14640 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
14650 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
14660 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
14670 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
14680 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
14690 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
146a0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
146b0 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
146c0 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
146d0 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
146e0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
146f0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
14700 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
14710 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
14720 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
14730 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
14740 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
14750 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
14760 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
14770 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
14780 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
14790 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
147a0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
147b0 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
147c0 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
147d0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
147e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
147f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
14800 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
14810 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14820 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
14830 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
14840 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
14850 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
14860 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
14870 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
14880 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
14890 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
148a0 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
148b0 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
148c0 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
148d0 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
148e0 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
148f0 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
14900 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
14910 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
14920 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
14930 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
14940 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
14950 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
14960 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
14970 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
14980 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
14990 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
149a0 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
149b0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
149c0 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
149d0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
149e0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
149f0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
14a00 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
14a10 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
14a20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
14a30 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
14a40 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
14a50 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
14a60 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
14a70 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
14a80 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
14a90 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
14aa0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
14ab0 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
14ac0 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
14ad0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
14ae0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
14af0 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
14b00 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b  lrc2, lrc1Errno;
14b10 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
14b20 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
14b30 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
14b40 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
14b50 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
14b60 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
14b70 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
14b80 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
14b90 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
14ba0 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
14bb0 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
14bc0 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
14bd0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
14be0 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
14bf0 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
14c00 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
14c10 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
14c20 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
14c30 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
14c40 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
14c50 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
14c60 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
14c70 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
14c80 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
14c90 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
14ca0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
14cb0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
14cc0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
14cd0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
14ce0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
14cf0 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
14d00 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
14d10 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
14d20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
14d30 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
14d40 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
14d50 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
14d60 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14d70 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
14d80 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
14d90 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
14da0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
14db0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
14dc0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45  astErrno = lrc1E
14dd0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
14de0 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
14df0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
14e00 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
14e10 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
14e20 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
14e30 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
14e40 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
14e50 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
14e60 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
14e70 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
14e80 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
14e90 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
14ea0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
14eb0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
14ec0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
14ed0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
14ee0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
14ef0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
14f00 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
14f10 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
14f20 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
14f30 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
14f40 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
14f50 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
14f60 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
14f70 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
14f80 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
14f90 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
14fa0 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
14fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14fc0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
14fd0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
14fe0 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
14ff0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
15000 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
15010 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
15020 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
15030 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
15040 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
15050 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
15060 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
15070 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
15080 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
15090 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
150a0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
150b0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
150c0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
150d0 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
150e0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
150f0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
15100 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
15110 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
15120 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15130 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15140 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
15150 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
15160 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
15170 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
15180 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
15190 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
151a0 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
151b0 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
151c0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
151d0 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
151e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
151f0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
15200 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
15210 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
15220 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
15230 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
15240 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
15250 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
15260 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
15270 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
15280 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
15290 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
152a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
152b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
152c0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
152d0 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
152f0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
15300 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
15310 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
15320 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15330 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
15340 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
15350 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
15360 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
15370 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
15380 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15390 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
153a0 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
153d0 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
153e0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
153f0 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
15400 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15410 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
15440 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
15450 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
15460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
15470 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
15480 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
15490 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
154a0 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
154b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
154c0 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
154d0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
154e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
154f0 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
15500 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
15510 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
15520 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
15530 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
15540 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
15550 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15560 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
15570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15580 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
15590 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
155a0 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
155b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
155c0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
155d0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
155e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
155f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15600 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
15610 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
15620 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15630 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
15640 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
15650 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
15660 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
15670 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
15680 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15690 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
156a0 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
156b0 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
156c0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
156d0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
156e0 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
156f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
15700 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
15710 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
15720 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
15730 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
15740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15750 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
15760 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
15770 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15780 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
15790 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
157a0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
157b0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
157c0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
157d0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
157e0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
157f0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
15800 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
15810 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
15820 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
15830 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
15840 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
15850 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
15860 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15870 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
15880 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
15890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
158a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
158b0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
158c0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
158d0 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
158e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
158f0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
15900 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
15910 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
15920 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
15930 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
15940 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
15950 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
15960 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
15970 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
15980 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
15990 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
159a0 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
159b0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
159c0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
159d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
159e0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
159f0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
15a00 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
15a10 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
15a20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
15a30 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
15a40 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
15a50 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
15a60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
15a70 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
15a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15a90 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
15aa0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
15ab0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
15ac0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
15ad0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
15ae0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
15af0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
15b00 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
15b10 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
15b20 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
15b30 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
15b40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
15b50 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
15b60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
15b70 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
15b80 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
15b90 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64  n(0);.    .#ifnd
15ba0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
15bb0 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
15bc0 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
15bd0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
15be0 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
15bf0 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
15c00 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
15c10 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
15c20 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
15c30 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
15c40 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
15c50 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
15c60 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
15c70 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
15c80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15c90 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
15ca0 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
15cb0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
15cc0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
15cd0 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
15ce0 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
15cf0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
15d00 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
15d10 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
15d20 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
15d30 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
15d40 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
15d50 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
15d60 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
15d70 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
15d80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15d90 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
15da0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
15db0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
15dc0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
15dd0 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
15de0 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20  rChng==1 );.    
15df0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
15e00 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
15e10 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
15e20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
15e30 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
15e40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
15e50 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15e60 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15e70 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
15e80 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
15e90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15ea0 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
15eb0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15ec0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
15ed0 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20  ared>1) ){.     
15ee0 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
15ef0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
15f00 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
15f10 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
15f20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
15f30 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
15f40 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
15f50 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
15f60 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15f70 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15f80 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
15f90 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
15fa0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
15fb0 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d      skipShared =
15fc0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15fd0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
15fe0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
15ff0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
16000 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
16010 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
16020 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16030 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
16040 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
16050 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
16060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16070 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16080 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
16090 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  && context->rese
160a0 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  rved ){.      rc
160b0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
160c0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
160d0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
160e0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
160f0 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20    if( !rc ){ .  
16100 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
16110 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20  eserved = 0; .  
16120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16140 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
16150 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
16160 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
16170 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  1)){.      pInod
16180 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
16190 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
161a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
161b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69  SQLITE_OK && eFi
161c0 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
161d0 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
161e0 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
161f0 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
16200 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
16210 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
16220 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
16230 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
16240 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
16250 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
16260 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
16270 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
16280 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
16290 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
162a0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
162b0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
162c0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
162d0 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
162e0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
162f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d  ==0 ){.      Sim
16300 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
16310 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
16320 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
16330 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
16340 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
16350 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
16360 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a   !skipShared ){.
16370 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
16380 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16390 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
163a0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
163b0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
163c0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
163d0 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
163e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
163f0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
16400 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16410 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
16420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
16430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16440 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
16450 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
16460 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
16470 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
16480 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
16490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
164a0 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
164b0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
164c0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
164d0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
164e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
164f0 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
16500 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16510 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
16520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
16530 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
16540 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
16550 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
16560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
16570 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
16580 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
16590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
165a0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
165b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
165c0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
165d0 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69  .    afpUnlock(i
165e0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
165f0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16600 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
16610 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
16620 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
16630 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
16640 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
16650 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
16660 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
16670 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
16680 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
16690 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
166a0 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
166b0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
166c0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
166d0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
166e0 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69  o pInode->aPendi
166f0 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
16700 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
16710 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20  osed when.      
16720 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  ** the last lock
16730 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
16740 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50     */.      setP
16750 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
16760 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
16770 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
16780 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
16790 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
167a0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
167b0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
167c0 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69  ile(id);.    uni
167d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
167e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
167f0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
16800 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
16810 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
16820 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
16830 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
16840 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46   above is the AF
16850 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
16860 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
16870 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
16880 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
16890 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
168a0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
168b0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
168c0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
168d0 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f  able.  If you do
168e0 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20  n't compile for 
168f0 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20  a mac, then the 
16900 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46  "unix-afp".** VF
16910 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  S is not availab
16920 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
16930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
16940 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   of the AFP lock
16950 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16970 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
16980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
169a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
169b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
169c0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
169d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
169e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
169f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a10 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a30 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f  *** Begin NFS Lo
16a40 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
16a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a60 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66  ******/..#if def
16a70 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
16a80 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
16a90 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
16aa0 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  *. ** Lower the 
16ab0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
16ac0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16ad0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
16ae0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
16af0 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
16b00 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
16b10 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20  ARED_LOCK.. **. 
16b20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
16b30 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
16b40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
16b50 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
16b60 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65  below. ** the re
16b70 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
16b80 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
16b90 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16ba0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
16bb0 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fsUnlock(sqlite3
16bc0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
16bd0 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
16be0 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  urn _posixUnlock
16bf0 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
16c00 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
16c10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16c20 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16c30 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16c40 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
16c50 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
16c60 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
16c70 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
16c80 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
16c90 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
16ca0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
16cb0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
16cc0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
16cd0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
16ce0 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
16cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d00 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
16d10 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
16d20 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
16d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
16d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
16d90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
16da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
16e00 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
16e10 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
16e30 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
16e40 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
16e50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
16e60 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
16e70 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
16e80 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
16e90 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
16ea0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
16eb0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
16ec0 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
16ed0 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
16ee0 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
16ef0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
16f00 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
16f10 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
16f20 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
16f30 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
16f40 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
16f50 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
16f60 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
16f70 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
16f80 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
16f90 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
16fa0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
16fb0 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
16fc0 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
16fd0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16fe0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
16ff0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
17000 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
17010 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
17020 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
17030 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
17040 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
17050 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
17060 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
17070 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
17080 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
17090 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
170a0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
170b0 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
170c0 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
170d0 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
170e0 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
170f0 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
17100 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
17110 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
17120 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
17130 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
17140 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
17150 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
17160 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
17170 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
17180 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
17190 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
171a0 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
171b0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
171c0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
171d0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
171e0 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
171f0 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
17200 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
17210 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
17220 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
17230 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
17240 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
17250 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
17260 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  EAD).  do{ got =
17270 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
17280 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
17290 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  t); }while( got<
172a0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
172b0 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  R );.  SimulateI
172c0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
172d0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
172e0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
172f0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65   do{ got = osPre
17300 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
17310 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
17320 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
17330 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
17340 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17350 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
17360 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
17370 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
17380 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
17390 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
173a0 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
173b0 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  - );.  if( newOf
173c0 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
173d0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
173e0 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
173f0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
17400 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
17410 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
17420 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
17430 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
17440 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
17450 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
17460 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  }.  do{ got = os
17470 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  Read(id->h, pBuf
17480 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20  , cnt); }while( 
17490 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
174a0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
174b0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
174c0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
174d0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
174e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
174f0 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  no;.  }.  OSTRAC
17500 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
17510 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
17520 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
17530 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
17540 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
17550 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
17560 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
17570 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
17580 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
17590 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
175a0 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
175b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
175c0 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
175d0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
175e0 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
175f0 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
17600 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
17610 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
17620 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
17630 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
17640 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
17650 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17660 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
17670 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
17680 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20  rt( id );..  /* 
17690 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
176a0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
176b0 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
176c0 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
176d0 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
176e0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
176f0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
17700 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
17710 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
17720 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
17730 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
17740 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
17750 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
17760 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
17770 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
17780 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
17790 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
177a0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
177b0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
177c0 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
177d0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
177e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
177f0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
17800 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
17810 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
17820 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
17830 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17840 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
17850 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
17860 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
17870 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
17880 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
17890 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
178a0 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
178b0 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
178c0 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
178d0 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
178e0 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
178f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17900 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
17910 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
17920 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
17930 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
17940 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
17950 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
17960 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17970 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
17980 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
17990 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
179a0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
179b0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
179c0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
179d0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
179e0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
179f0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
17a00 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
17a10 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
17a20 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
17a30 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
17a40 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
17a50 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
17a60 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
17a70 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
17a80 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
17a90 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
17aa0 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
17ab0 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
17ac0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
17ad0 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f  D).  do{ got = o
17ae0 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  sPwrite(id->h, p
17af0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
17b00 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
17b10 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
17b20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
17b30 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
17b40 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72   do{ got = osPwr
17b50 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
17b60 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
17b70 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
17b80 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
17b90 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65  #else.  newOffse
17ba0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
17bb0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
17bc0 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66  T);.  if( newOff
17bd0 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
17be0 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
17bf0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
17c00 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
17c10 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17c20 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  no;.    }else{. 
17c30 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
17c40 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
17c50 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20  = 0;....    }.  
17c60 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
17c70 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 57  .  do{ got = osW
17c80 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
17c90 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20  , cnt); }while( 
17ca0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
17cb0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
17cc0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
17cd0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
17ce0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
17cf0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17d00 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  no;.  }..  OSTRA
17d10 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE(("WRITE   %-3
17d20 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
17d30 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
17d40 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45   offset, TIMER_E
17d50 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
17d60 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn got;.}.../*.*
17d70 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
17d80 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
17d90 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
17da0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
17db0 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
17dc0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
17dd0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
17de0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57  static int unixW
17df0 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
17e00 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e  file *id, .  con
17e10 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  st void *pBuf, .
17e20 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
17e30 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
17e40 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  t .){.  unixFile
17e50 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17e60 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77  ile*)id;.  int w
17e70 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
17e80 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
17e90 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
17ea0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
17eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
17ec0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
17ed0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
17ee0 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
17ef0 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
17f00 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
17f10 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
17f20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
17f30 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
17f40 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
17f50 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
17f60 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
17f70 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
17f80 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
17f90 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
17fa0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
17fb0 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
17fc0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
17fd0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
17fe0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
17ff0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
18000 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
18010 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
18020 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
18030 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
18040 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
18050 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
18060 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
18070 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
18080 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
18090 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
180a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
180b0 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
180c0 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
180d0 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
180e0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
180f0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
18100 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
18110 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
18120 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
18130 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
18140 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
18150 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
18160 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
18170 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
18180 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
18190 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
181a0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
181b0 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
181c0 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
181d0 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
181e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
181f0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
18200 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
18210 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
18220 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
18230 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
18240 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
18250 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
18260 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
18270 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
18280 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
18290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
182a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
182b0 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
182c0 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
182d0 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
182e0 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
182f0 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
18300 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
18310 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
18320 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
18330 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
18340 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18350 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
18360 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
18370 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
18380 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
18390 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
183a0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
183b0 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  ote<0 ){.      /
183c0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
183d0 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
183e0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
183f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
18400 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
18410 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
18420 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
18430 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
18440 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
18450 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
18460 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
18470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18490 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
184a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
184b0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
184c0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
184d0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
184e0 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
184f0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
18500 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
18510 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
18520 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
18530 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
18540 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
18550 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
18560 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
18570 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
18580 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
18590 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
185a0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
185b0 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
185c0 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
185d0 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
185e0 68 65 20 28 73 6c 6f 77 65 72 29 20 66 73 79 6e  he (slower) fsyn
185f0 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 6b  c()..** If you k
18600 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79  now that your sy
18610 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72  stem does suppor
18620 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f  t fdatasync() co
18630 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e  rrectly,.** then
18640 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20   simply compile 
18650 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63  with -Dfdatasync
18660 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69  =fdatasync.*/.#i
18670 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61  f !defined(fdata
18680 73 79 6e 63 29 20 26 26 20 21 64 65 66 69 6e 65  sync) && !define
18690 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64  d(__linux__).# d
186a0 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
186b0 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
186c0 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
186d0 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
186e0 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
186f0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
18700 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
18710 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
18720 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
18730 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
18740 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
18750 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
18760 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
18770 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
18780 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
18790 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
187a0 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
187b0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
187c0 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
187d0 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
187e0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
187f0 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
18800 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
18810 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
18820 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
18830 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
18840 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
18850 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
18860 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
18870 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
18880 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
18890 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
188a0 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
188b0 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
188c0 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
188d0 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
188e0 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
188f0 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
18900 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
18910 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
18920 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
18930 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
18940 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
18950 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
18960 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
18970 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
18980 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
18990 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
189a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
189b0 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
189c0 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
189d0 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
189e0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
189f0 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
18a00 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
18a10 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
18a20 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
18a30 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
18a40 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
18a50 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
18a60 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
18a70 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
18a80 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
18a90 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
18aa0 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
18ab0 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
18ac0 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
18ad0 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
18ae0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
18af0 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
18b00 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
18b10 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
18b20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
18b30 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
18b40 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
18b50 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
18b60 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
18b70 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
18b80 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
18b90 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
18ba0 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
18bb0 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
18bc0 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
18bd0 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
18be0 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
18bf0 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
18c00 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
18c10 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
18c20 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
18c30 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
18c40 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
18c50 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
18c60 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
18c70 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
18c80 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
18c90 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
18ca0 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
18cb0 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
18cc0 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
18cd0 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
18ce0 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
18cf0 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
18d00 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
18d10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
18d20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
18d30 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
18d40 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
18d50 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
18d60 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
18d70 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
18d80 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
18d90 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
18da0 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
18db0 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
18dc0 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
18dd0 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
18de0 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
18df0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
18e00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18e10 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
18e20 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
18e30 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
18e40 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
18e50 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
18e60 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
18e70 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
18e80 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
18e90 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
18ea0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
18eb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
18ec0 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
18ed0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
18ee0 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
18ef0 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
18f00 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
18f10 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
18f20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
18f30 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
18f40 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
18f50 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
18f60 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
18f70 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
18f80 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
18f90 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18fa0 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
18fb0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
18fc0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
18fd0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
18fe0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
18ff0 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
19000 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
19010 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
19020 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
19030 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
19040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
19050 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
19060 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56  TE_OK;.#elif HAV
19070 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
19080 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
19090 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66    rc = osFcntl(f
190a0 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
190b0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
190c0 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
190d0 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59  * If the FULLFSY
190e0 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20  NC failed, fall 
190f0 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69  back to attempti
19100 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20  ng an fsync().. 
19110 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74   ** It shouldn't
19120 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
19130 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61   fullfsync to fa
19140 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  il on the local 
19150 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  .  ** file syste
19160 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66  m (on OSX), so f
19170 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73  ailure indicates
19180 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a   that FULLFSYNC.
19190 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f    ** isn't suppo
191a0 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69  rted for this fi
191b0 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61  le system. So, a
191c0 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20  ttempt an fsync 
191d0 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e  .  ** and (for n
191e0 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f  ow) ignore the o
191f0 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70  verhead of a sup
19200 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63  erfluous fcntl c
19210 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64  all.  .  ** It'd
19220 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65   be better to de
19230 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73  tect fullfsync s
19240 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20  upport once and 
19250 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20  avoid .  ** the 
19260 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79  fcntl call every
19270 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61   time sync is ca
19280 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lled..  */.  if(
19290 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
192a0 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66  (fd);..#elif def
192b0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
192c0 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29    /* fdatasync()
192d0 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74   on HFS+ doesn't
192e0 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66   yet flush the f
192f0 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63  ile size if it c
19300 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79  hanged correctly
19310 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74  .  ** so current
19320 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
19330 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
19340 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
19350 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a  ync to fsync.  *
19360 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66  /.  rc = fsync(f
19370 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20  d);.#else .  rc 
19380 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b  = fdatasync(fd);
19390 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
193a0 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20    if( rc==-1 && 
193b0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29  errno==ENOTSUP )
193c0 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
193d0 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
193e0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
193f0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  /.#endif /* ifde
19400 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
19410 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46   elif HAVE_FULLF
19420 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f  SYNC */..  if( O
19430 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21  S_VXWORKS && rc!
19440 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
19450 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
19460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
19470 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
19480 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
19490 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
194a0 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
194b0 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
194c0 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
194d0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
194e0 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
194f0 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
19500 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
19510 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
19520 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
19530 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
19540 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
19550 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
19560 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
19570 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
19580 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
19590 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
195a0 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
195b0 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
195c0 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
195d0 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
195e0 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
195f0 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
19600 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
19610 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
19620 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
19630 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
19640 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
19650 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
19660 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
19670 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
19680 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
19690 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
196a0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
196b0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
196c0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
196d0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
196e0 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
196f0 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
19700 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
19710 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
19720 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
19730 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
19740 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
19750 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
19760 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19770 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
19780 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
19790 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
197a0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
197b0 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
197c0 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
197d0 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
197e0 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
197f0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
19800 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
19810 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
19820 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
19830 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
19840 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
19850 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
19860 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
19870 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
19880 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
19890 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
198a0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
198b0 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
198c0 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
198d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
198e0 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
198f0 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
19900 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
19910 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
19920 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
19930 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
19940 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
19950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
19960 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
19970 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
19980 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
19990 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
199a0 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
199b0 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
199c0 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
199d0 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
199e0 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
199f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
19a00 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
19a10 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
19a20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
19a30 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
19a40 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
19a50 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
19a60 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
19a70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
19a80 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
19a90 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61  DIRSYNC %-3d (ha
19aa0 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
19ab0 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
19ac0 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20   pFile->dirfd,. 
19ad0 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
19ae0 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
19af0 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64 65 66  lsync));.#ifndef
19b00 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
19b10 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54  DIRSYNC.    /* T
19b20 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
19b30 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  c is only attemp
19b40 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e  ted if full_fsyn
19b50 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e  c is.    ** turn
19b60 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69  ed off or unavai
19b70 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c  lable.  If a ful
19b80 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64  l_fsync occurred
19b90 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74   above,.    ** t
19ba0 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  hen the director
19bb0 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66  y sync is superf
19bc0 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  luous..    */.  
19bd0 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c    if( (!HAVE_FUL
19be0 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c  LFSYNC || !isFul
19bf0 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66  lsync) && full_f
19c00 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66  sync(pFile->dirf
19c10 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  d,0,0) ){.      
19c20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65   /*.       ** We
19c30 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d   have received m
19c40 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20  ultiple reports 
19c50 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72  of fsync() retur
19c60 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65  ning.       ** e
19c70 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69  rrors when appli
19c80 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65  ed to directorie
19c90 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c  s on certain fil
19ca0 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  e systems..     
19cb0 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69    ** A failed di
19cc0 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
19cd0 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20  not a big deal. 
19ce0 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20   So it seems.   
19cf0 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f      ** better to
19d00 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f   ignore the erro
19d10 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37  r.  Ticket #1657
19d20 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
19d30 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73 74    /* pFile->last
19d40 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 2a  Errno = errno; *
19d50 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  /.       /* retu
19d60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
19d70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   */.    }.#endif
19d80 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  .    /* Only nee
19d90 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
19da0 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20 64 69  so close the  di
19db0 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65 20  rectory when we 
19dc0 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20  are done */.    
19dd0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
19de0 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  le, pFile->dirfd
19df0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
19e00 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
19e10 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
19e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
19e30 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
19e40 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
19e50 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
19e60 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
19e70 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
19e80 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
19e90 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
19ea0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
19eb0 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )id;.  int rc;. 
19ec0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
19ed0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
19ee0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
19ef0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
19f00 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
19f10 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
19f20 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
19f30 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
19f40 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
19f50 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
19f60 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
19f70 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
19f80 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
19f90 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
19fa0 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
19fb0 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
19fc0 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
19fd0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
19fe0 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
19ff0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1a000 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42  zChunk ){.    nB
1a010 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1a020 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1a030 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1a040 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1a050 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1a060 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1a070 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66  te(pFile->h, (of
1a080 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1a090 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1a0a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1a0b0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1a0c0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1a0d0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1a0e0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1a0f0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1a100 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
1a110 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
1a120 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1a130 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1a140 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1a150 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1a160 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1a170 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1a180 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1a190 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1a1a0 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1a1b0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1a1c0 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1a1d0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1a1e0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1a1f0 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1a200 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1a210 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1a220 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1a230 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1a240 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1a250 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1a260 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1a270 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1a280 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1a290 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1a2a0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1a2b0 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1a2c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1a2d0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1a2e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1a2f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a300 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1a310 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1a320 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1a330 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1a340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1a350 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1a360 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1a370 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1a380 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1a390 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1a3a0 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1a3b0 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1a3c0 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1a3d0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1a3e0 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1a3f0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1a400 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1a410 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1a420 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
1a430 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1a440 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1a450 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1a460 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1a470 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1a480 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1a490 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1a4a0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1a4b0 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1a4c0 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1a4d0 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1a4e0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1a4f0 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1a500 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1a510 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1a520 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1a530 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1a540 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1a550 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1a560 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1a570 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1a580 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1a590 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1a5a0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1a5b0 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1a5c0 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1a5d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1a5e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1a5f0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1a600 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1a610 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1a620 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1a630 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1a640 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1a650 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1a660 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1a670 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1a680 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1a690 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1a6a0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1a6b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1a6c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a6d0 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1a6e0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1a6f0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1a700 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1a710 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
1a720 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1a730 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1a740 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1a750 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64 20 62  file, it could b
1a760 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69  e.** that the fi
1a770 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 65  le needs to be e
1a780 78 74 65 6e 64 65 64 20 61 74 20 74 68 69 73 20  xtended at this 
1a790 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69 73 65  point. Otherwise
1a7a0 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  , the.** SQLITE_
1a7b0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
1a7c0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 6e  operation is a n
1a7d0 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e 0a 2a  o-op for Unix..*
1a7e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1a7f0 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1a800 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1a810 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1a820 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a  ile->szChunk ){.
1a830 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a850 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
1a860 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1a870 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a890 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1a8a0 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1a8b0 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1a8c0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1a8d0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72  le->h, &buf) ) r
1a8e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a8f0 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e  RR_FSTAT;..    n
1a900 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70  Size = ((nByte+p
1a910 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29  File->szChunk-1)
1a920 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   / pFile->szChun
1a930 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1a940 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  unk;.    if( nSi
1a950 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73  ze>(i64)buf.st_s
1a960 69 7a 65 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  ize ){.#if defin
1a970 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
1a980 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
1a990 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1a9a0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1a9b0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1a9c0 20 72 63 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74   rc = osFallocat
1a9d0 65 28 70 46 69 6c 65 2d 3e 2e 68 2c 20 62 75 66  e(pFile->.h, buf
1a9e0 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
1a9f0 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 20  buf.st_size;.   
1aa00 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20     }while( rc<0 
1aa10 26 26 20 65 72 72 6e 6f 3d 45 49 4e 54 52 20 29  && errno=EINTR )
1aa20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1aa30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1aa40 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73  OERR_WRITE;.#els
1aa50 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  e.      /* If th
1aa60 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61  e OS does not ha
1aa70 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  ve posix_falloca
1aa80 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46  te(), fake it. F
1aa90 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a  irst use.      *
1aaa0 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  * ftruncate() to
1aab0 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73 69   set the file si
1aac0 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ze, then write a
1aad0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a   single byte to.
1aae0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
1aaf0 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62  t byte in each b
1ab00 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  lock within the 
1ab10 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e  extended region.
1ab20 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
1ab30 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e  s the same techn
1ab40 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c 69  ique used by gli
1ab50 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  bc to implement 
1ab60 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1ab70 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79  ).      ** on sy
1ab80 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f  stems that do no
1ab90 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61  t have a real fa
1aba0 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d  llocate() system
1abb0 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a   call..      */.
1abc0 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d        int nBlk =
1abd0 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b   buf.st_blksize;
1abe0 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d    /* File-system
1abf0 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20   block size */. 
1ac00 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b       i64 iWrite;
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20   /* Next offset 
1ac30 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
1ac40 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b       int nWrite;
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1ac70 20 66 72 6f 6d 20 73 65 65 6b 41 6e 64 57 72 69   from seekAndWri
1ac80 74 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 69  te() */..      i
1ac90 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
1aca0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53  ate(pFile->h, nS
1acb0 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ize) ){.        
1acc0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1acd0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1ace0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1acf0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1ad00 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1ad10 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1ad20 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1ad30 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1ad40 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20  ((buf.st_size + 
1ad50 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b  2*nBlk - 1)/nBlk
1ad60 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20  )*nBlk-1;.      
1ad70 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 6e 57 72  do {.        nWr
1ad80 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1ad90 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1ada0 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1adb0 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b    iWrite += nBlk
1adc0 3b 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28  ;.      } while(
1add0 20 6e 57 72 69 74 65 3d 3d 31 20 26 26 20 69 57   nWrite==1 && iW
1ade0 72 69 74 65 3c 6e 53 69 7a 65 20 29 3b 0a 20 20  rite<nSize );.  
1adf0 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
1ae00 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1ae10 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23  E_IOERR_WRITE;.#
1ae20 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1ae30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ae40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1ae50 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1ae60 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1ae70 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1ae80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1ae90 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1aea0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1aeb0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1aec0 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
1aed0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1aee0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
1aef0 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
1af00 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
1af10 46 69 6c 65 2a 29 69 64 29 2d 3e 65 46 69 6c 65  File*)id)->eFile
1af20 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1af30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1af40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1af50 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
1af60 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1af70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65  Arg = ((unixFile
1af80 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1af90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1afa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1afb0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1afc0 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
1afd0 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1afe0 46 69 6c 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75  File*)id)->szChu
1aff0 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
1b000 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  g;.      return 
1b010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b020 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b030 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1b040 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1b050 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 28   fcntlSizeHint((
1b060 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 2c 20 2a  unixFile *)id, *
1b070 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
1b080 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
1b090 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
1b0a0 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
1b0b0 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
1b0c0 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
1b0d0 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
1b0e0 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1b0f0 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
1b100 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
1b110 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
1b120 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
1b130 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b140 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1b150 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
1b160 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
1b170 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b180 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1b190 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
1b1a0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
1b1b0 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
1b1c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b1d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
1b1e0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1b1f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1b200 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1b210 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
1b220 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
1b230 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1b240 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
1b250 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
1b260 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
1b270 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
1b280 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
1b290 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1b2a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1b2b0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1b2c0 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20  _APPLE__) */.   
1b2d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b2e0 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a  TL_SYNC_OMITTED:
1b2f0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1b300 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41  SQLITE_OK;  /* A
1b310 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a   no-op */.    }.
1b320 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b330 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
1b340 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1b350 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
1b360 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
1b370 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
1b380 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
1b390 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
1b3a0 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
1b3b0 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1b3c0 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
1b3d0 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
1b3e0 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
1b3f0 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
1b400 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
1b410 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
1b420 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
1b430 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
1b440 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
1b450 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
1b460 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
1b470 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
1b480 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
1b490 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
1b4a0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1b4b0 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
1b4c0 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
1b4d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1b4e0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1b4f0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
1b500 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1b510 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1b520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b530 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1b540 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE;.}../*.** Re
1b550 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
1b560 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1b570 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68  for the file. Th
1b580 69 73 20 69 73 20 61 6c 77 61 79 73 20 30 20 66  is is always 0 f
1b590 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74  or unix..*/.stat
1b5a0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
1b5b0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1b5c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
1b5d0 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
1b5e0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1b5f0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  sed);.  return 0
1b600 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b610 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f  ITE_OMIT_WAL.../
1b620 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
1b630 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e   to represent an
1b640 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
1b650 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  uffer.  .**.** W
1b660 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
1b670 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
1b680 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d  ce the same wal-
1b690 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65  index, each thre
1b6a0 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77  ad.** has its ow
1b6b0 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  n unixShm object
1b6c0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70  , but they all p
1b6d0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
1b6e0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
1b6f0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
1b700 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
1b710 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77  er words, each w
1b720 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  al-index is open
1b730 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20  ed.** only once 
1b740 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
1b750 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e  ** Each unixShmN
1b760 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  ode object is co
1b770 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e  nnected to a sin
1b780 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  gle unixInodeInf
1b790 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20  o object..** We 
1b7a0 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74  could coalesce t
1b7b0 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  his object into 
1b7c0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62  unixInodeInfo, b
1b7d0 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65  ut that would me
1b7e0 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e  an.** every open
1b7f0 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20   file that does 
1b800 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d  not use shared m
1b810 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20  emory (in other 
1b820 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f  words, most.** o
1b830 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64  pen files) would
1b840 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61   have to carry a
1b850 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61  round this extra
1b860 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
1b870 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f  o.** the unixIno
1b880 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  deInfo object co
1b890 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1b8a0 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d   to this unixShm
1b8b0 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  Node object.** a
1b8c0 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  nd the unixShmNo
1b8d0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  de object is cre
1b8e0 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e  ated only when n
1b8f0 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69  eeded..**.** uni
1b900 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
1b910 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
1b920 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
1b930 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
1b940 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
1b950 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b960 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
1b970 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
1b980 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65    nRef.**.** The
1b990 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1b9a0 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
1b9b0 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
1b9c0 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
1b9d0 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
1b9e0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
1b9f0 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78  *.** Either unix
1ba00 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
1ba10 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e  st be held or un
1ba20 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
1ba30 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74  0 and.** unixMut
1ba40 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
1ba50 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
1ba60 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
1ba70 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
1ba80 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
1ba90 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
1baa0 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f  Node {.  unixIno
1bab0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1bac0 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65      /* unixInode
1bad0 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74  Info that owns t
1bae0 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a  his SHM node */.
1baf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
1bb00 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
1bb10 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
1bb20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
1bb30 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1bb40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1bb50 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70  ame of the mmapp
1bb60 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1bb70 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
1bb80 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1bb90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1bba0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
1bbb0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1bbc0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
1bbd0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1bbe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f   */.  int nRegio
1bbf0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1bc00 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
1bc10 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
1bc20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
1bc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1bc40 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
1bc50 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1bc60 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
1bc70 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1bc80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bc90 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
1bca0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1bcb0 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
1bcc0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1bcd0 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
1bce0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1bcf0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
1bd00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1bd10 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd30 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
1bd40 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
1bd50 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
1bd60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bd70 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1bd80 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1bd90 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
1bda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1bdb0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
1bdc0 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
1bdd0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
1bde0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
1bdf0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
1be00 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
1be10 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
1be20 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
1be30 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
1be40 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
1be50 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1be60 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
1be70 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
1be80 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
1be90 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
1bea0 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
1beb0 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
1bec0 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
1bed0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
1bee0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
1bef0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
1bf00 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
1bf10 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
1bf20 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
1bf30 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
1bf40 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
1bf50 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
1bf60 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1bf70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
1bf80 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
1bf90 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1bfa0 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
1bfb0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
1bfc0 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
1bfd0 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
1bfe0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1bff0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
1c000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c010 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
1c020 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
1c030 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
1c040 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1c050 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1c060 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1c070 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
1c080 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1c090 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1c0a0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1c0b0 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
1c0c0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
1c0d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c0e0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
1c0f0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1c100 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
1c110 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  mNode */.#endif.
1c120 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
1c130 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
1c140 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
1c150 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20  UNIX_SHM_BASE   
1c160 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
1c170 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
1c180 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
1c190 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
1c1a0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
1c1b0 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53  (UNIX_SHM_BASE+S
1c1c0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1c1d0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
1c1e0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
1c1f0 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f  ply posix adviso
1c200 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
1c210 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74   bytes from ofst
1c220 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d   through ofst+n-
1c230 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62  1..**.** Locks b
1c240 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b  lock if the mask
1c250 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58   is exactly UNIX
1c260 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e  _SHM_C and are n
1c270 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  on-blocking.** o
1c280 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1c290 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
1c2a0 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69  ystemLock(.  uni
1c2b0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1c2c0 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de, /* Apply loc
1c2d0 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
1c2e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1c2f0 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
1c300 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
1c310 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
1c320 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
1c330 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c350 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
1c360 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
1c370 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c390 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1c3a0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
1c3b0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
1c3c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
1c3d0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
1c3e0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
1c3f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c400 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75  TE_OK;   /* Resu
1c410 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
1c420 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
1c430 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
1c440 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
1c450 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
1c460 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
1c470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1c480 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
1c490 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ode->mutex) || p
1c4a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1c4b0 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
1c4c0 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
1c4d0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
1c4e0 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
1c4f0 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
1c500 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
1c510 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
1c520 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
1c530 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
1c540 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   n<SQLITE_SHM_NL
1c550 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  OCK );..  /* Ini
1c560 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
1c570 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1c580 2f 0a 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30  /.  memset(&f, 0
1c590 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20  , sizeof(f));.  
1c5a0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
1c5b0 79 70 65 3b 0a 20 20 66 2e 6c 5f 77 68 65 6e 63  ype;.  f.l_whenc
1c5c0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
1c5d0 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74  f.l_start = ofst
1c5e0 3b 0a 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b  ;.  f.l_len = n;
1c5f0 0a 0a 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c  ..  rc = osFcntl
1c600 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
1c610 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 72 63  SETLK, &f);.  rc
1c620 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20   = (rc!=(-1)) ? 
1c630 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1c640 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f 2a 20 55  TE_BUSY;..  /* U
1c650 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c  pdate the global
1c660 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20   lock state and 
1c670 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67  do debug tracing
1c680 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1c690 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20  E_DEBUG.  { u16 
1c6a0 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28  mask;.  OSTRACE(
1c6b0 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a  ("SHM-LOCK "));.
1c6c0 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
1c6d0 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
1c6e0 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
1c6f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1c700 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
1c710 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
1c720 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
1c730 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
1c740 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
1c750 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1c760 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1c770 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1c780 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  ~mask;.    }else
1c790 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1c7a0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
1c7b0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
1c7c0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1c7d0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1c7e0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
1c7f0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
1c800 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1c810 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
1c820 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1c830 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
1c840 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
1c850 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
1c860 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1c870 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1c880 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20  de->exclMask |= 
1c890 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
1c8a0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1c8b0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1c8c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1c8d0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
1c8e0 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
1c8f0 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
1c900 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
1c910 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c920 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
1c930 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1c940 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66  CE(("read-lock f
1c950 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65  ailed"));.    }e
1c960 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1c970 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
1c980 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
1c990 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
1c9a0 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
1c9b0 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  fst));.    }.  }
1c9c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20  .  OSTRACE((" - 
1c9d0 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c  afterwards %03x,
1c9e0 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
1c9f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1ca00 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f  aredMask, pShmNo
1ca10 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a  de->exclMask));.
1ca20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1ca30 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
1ca40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  .}.../*.** Purge
1ca50 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1ca60 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
1ca70 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
1ca80 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
1ca90 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
1caa0 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
1cab0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
1cac0 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
1cad0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1cae0 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
1caf0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
1cb00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cb10 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
1cb20 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
1cb30 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
1cb40 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
1cb50 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
1cb60 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
1cb70 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
1cb80 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
1cb90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
1cba0 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d  ert( p->pInode==
1cbb0 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  pFd->pInode );. 
1cbc0 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
1cbd0 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ) sqlite3_mutex_
1cbe0 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
1cbf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1cc00 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
1cc10 0a 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d  .      munmap(p-
1cc20 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
1cc30 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
1cc40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1cc50 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
1cc60 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
1cc70 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
1cc80 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
1cc90 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
1cca0 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
1ccb0 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
1ccc0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
1ccd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1cce0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
1ccf0 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64  ** Open a shared
1cd00 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
1cd10 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65  ociated with ope
1cd20 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1cd30 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73  pDbFd.  .** This
1cd40 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c   particular impl
1cd50 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
1cd60 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
1cd70 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73  *.** The file us
1cd80 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
1cd90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73  shared-memory is
1cda0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
1cdb0 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65  ectory.** as the
1cdc0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1cdd0 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20  ile and has the 
1cde0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
1cdf0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
1ce00 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  * file with the 
1ce10 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64  "-shm" suffix ad
1ce20 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ded.  For exampl
1ce30 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  e, if the databa
1ce40 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f  se file.** is "/
1ce50 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
1ce60 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66  g.db" then the f
1ce70 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61  ile that is crea
1ce80 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a  ted and mmapped.
1ce90 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  ** for shared me
1cea0 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c  mory will be cal
1ceb0 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31  led "/home/user1
1cec0 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e  /config.db-shm".
1ced0 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72    .**.** Another
1cee0 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20   approach to is 
1cef0 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20  to use files in 
1cf00 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76  /dev/shm or /dev
1cf10 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f  /tmp or an.** so
1cf20 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d  me other tmpfs m
1cf30 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66  ount. But if a f
1cf40 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65  ile in a differe
1cf50 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  nt directory.** 
1cf60 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1cf70 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20  e file is used, 
1cf80 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61  then differing a
1cf90 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
1cfa0 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74  s.** or a chroot
1cfb0 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  () might cause t
1cfc0 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  wo different pro
1cfd0 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61  cesses on the sa
1cfe0 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  me.** database t
1cff0 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64  o end up using d
1d000 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66  ifferent files f
1d010 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
1d020 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74   - .** meaning t
1d030 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  hat their memory
1d040 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c   would not reall
1d050 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65  y be shared - re
1d060 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61  sulting.** in da
1d070 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1d080 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  n.  Nevertheless
1d090 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c  , this tmpfs fil
1d0a0 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62  e usage.** can b
1d0b0 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  e enabled at com
1d0c0 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
1d0d0 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  -DSQLITE_SHM_DIR
1d0e0 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d  ECTORY="/dev/shm
1d0f0 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69  ".** or the equi
1d100 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65  valent.  The use
1d110 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   of the SQLITE_S
1d120 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
1d130 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74  pile-time.** opt
1d140 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ion results in a
1d150 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62  n incompatible b
1d160 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20  uild of SQLite; 
1d170 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74   builds of SQLit
1d180 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64  e.** that with d
1d190 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f  iffering SQLITE_
1d1a0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65  SHM_DIRECTORY se
1d1b0 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74  ttings attempt t
1d1c0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  o use the.** sam
1d1d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d1e0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
1d1f0 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  , database corru
1d200 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c  ption will likel
1d210 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65  y.** result. The
1d220 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1d230 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
1d240 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e  me option is con
1d250 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75  sidered.** "unsu
1d260 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79  pported" and may
1d270 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75   go away in a fu
1d280 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65  ture SQLite rele
1d290 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ase..**.** When 
1d2a0 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1d2b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1d2c0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1d2d0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1d2e0 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1d2f0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1d300 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1d310 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1d320 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1d330 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1d340 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1d350 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1d360 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1d370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1d380 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
1d390 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
1d3a0 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
1d3b0 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
1d3c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1d3d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1d3e0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
1d3f0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
1d400 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
1d410 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
1d420 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1d430 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1d460 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
1d470 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
1d480 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
1d490 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
1d4a0 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d4c0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1d4d0 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
1d4e0 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
1d4f0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1d500 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1d510 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
1d520 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
1d530 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1d540 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
1d550 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
1d560 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
1d570 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
1d580 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1d590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1d5a0 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
1d5b0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
1d5c0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1d5d0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
1d5e0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1d5f0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
1d600 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
1d610 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
1d620 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
1d630 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
1d640 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
1d650 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
1d660 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
1d670 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
1d680 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
1d690 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
1d6a0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
1d6b0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
1d6c0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1d6d0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
1d6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
1d6f0 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
1d700 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1d710 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
1d720 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
1d730 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
1d740 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
1d750 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
1d760 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
1d770 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
1d780 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
1d790 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
1d7a0 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
1d7b0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
1d7c0 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61  sions. The actua
1d7d0 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68  l permissions th
1d7e0 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  e file is create
1d7f0 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72  d.    ** with ar
1d800 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  e subject to the
1d810 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73   current umask s
1d820 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1d830 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1d840 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29  DbFd->h, &sStat)
1d850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1d860 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1d870 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
1d880 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1d890 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1d8a0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
1d8b0 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
1d8c0 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
1d8d0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
1d8e0 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   30;.#else.    n
1d8f0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20  ShmFilename = 5 
1d900 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44  + (int)strlen(pD
1d910 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e  bFd->zPath);.#en
1d920 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
1d930 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1d940 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
1d950 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
1d960 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
1d970 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
1d980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d990 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1d9a0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1d9b0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
1d9c0 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
1d9d0 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29  zeof(*pShmNode))
1d9e0 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
1d9f0 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
1da00 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
1da10 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
1da20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
1da30 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
1da40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1da50 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
1da60 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
1da90 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
1daa0 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
1dad0 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
1dae0 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
1daf0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1db00 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
1db10 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
1db20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1db30 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1db40 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1db50 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
1db60 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1db70 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1db80 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
1db90 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1dba0 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
1dbb0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1dbc0 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1dbd0 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1dbe0 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1dbf0 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1dc00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dc10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1dc20 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1dc30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 68  ;.    }..    pSh
1dc40 6d 4e 6f 64 65 2d 3e 68 20 3d 20 6f 73 4f 70 65  mNode->h = osOpe
1dc50 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  n(zShmFilename, 
1dc60 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
1dc70 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26  (sStat.st_mode &
1dc80 20 30 37 37 37 29 29 3b 0a 20 20 20 20 69 66 28   0777));.    if(
1dc90 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
1dca0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
1dcb0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1dcc0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
1dcd0 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65  "open", zShmFile
1dce0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  name);.      got
1dcf0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1dd00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
1dd10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
1dd20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1dd30 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
1dd40 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
1dd50 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
1dd60 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1dd70 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
1dd80 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1dd90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
1dda0 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
1ddb0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
1ddc0 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
1ddd0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
1dde0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1ddf0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1de00 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30  e(pShmNode->h, 0
1de10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1de20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
1de30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
1de40 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22  PEN, "ftruncate"
1de50 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
1de60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1de70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1de80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1de90 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
1dea0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
1deb0 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
1dec0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
1ded0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1dee0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1def0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
1df00 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
1df10 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
1df20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
1df30 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
1df40 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
1df50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1df60 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
1df70 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
1df80 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
1df90 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
1dfa0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
1dfb0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1dfc0 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
1dfd0 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
1dfe0 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
1dff0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
1e000 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
1e010 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
1e020 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1e030 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
1e040 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
1e050 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
1e060 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
1e070 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
1e080 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
1e090 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
1e0a0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
1e0b0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
1e0c0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
1e0d0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
1e0e0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
1e0f0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
1e100 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
1e110 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
1e120 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1e130 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
1e140 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1e150 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1e160 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
1e170 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
1e180 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
1e190 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
1e1a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1e1b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1e1c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1e1d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1e1e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
1e1f0 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
1e200 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
1e210 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
1e220 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
1e230 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1e240 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1e250 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1e260 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
1e270 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
1e280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e290 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e2a0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
1e2b0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
1e2c0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
1e2d0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
1e2e0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
1e2f0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1e300 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
1e310 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1e320 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
1e330 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
1e340 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
1e350 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1e360 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
1e370 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1e380 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1e390 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1e3a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e3b0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
1e3c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
1e3d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1e3e0 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
1e3f0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
1e400 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1e410 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
1e420 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
1e430 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
1e440 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
1e450 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
1e460 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
1e470 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
1e480 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
1e490 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
1e4a0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
1e4b0 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
1e4c0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
1e4d0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1e4e0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1e4f0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
1e500 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1e510 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
1e520 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1e530 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1e540 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1e550 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
1e560 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1e570 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
1e580 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
1e590 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1e5a0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
1e5b0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1e5c0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
1e5d0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
1e5e0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1e5f0 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
1e600 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
1e610 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
1e620 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1e630 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1e640 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
1e650 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1e660 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1e670 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
1e680 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
1e690 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
1e6a0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1e6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1e6c0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
1e6d0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
1e6e0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1e6f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e700 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1e710 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e730 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
1e740 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
1e750 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
1e760 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
1e770 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
1e780 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
1e790 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
1e7a0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
1e7b0 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
1e7c0 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
1e7d0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1e7e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e7f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1e800 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1e810 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
1e820 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
1e830 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28  it now. */.  if(
1e840 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
1e850 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
1e860 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1e870 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
1e880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e890 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1e8a0 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
1e8b0 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  hm;.  pShmNode =
1e8c0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20   p->pShmNode;.  
1e8d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1e8e0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1e8f0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1e900 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
1e910 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
1e920 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e930 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
1e940 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1e950 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
1e960 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
1e990 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
1e9a0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
1e9b0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67  iRegion+1)*szReg
1e9c0 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  ion;  /* Minimum
1e9d0 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
1e9e0 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
1e9f0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea10 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
1ea20 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
1ea30 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
1ea40 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
1ea50 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
1ea60 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
1ea70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
1ea80 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
1ea90 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
1eaa0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
1eab0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1eac0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
1ead0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
1eae0 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
1eaf0 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
1eb00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
1eb10 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
1eb20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1eb30 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74  ShmNode->h, &sSt
1eb40 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  at) ){.      rc 
1eb50 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
1eb60 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 67 6f  HMSIZE;.      go
1eb70 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1eb80 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
1eb90 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79  Stat.st_size<nBy
1eba0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
1ebb0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1ebc0 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
1ebd0 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
1ebe0 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
1ebf0 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
1ec00 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1ec10 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1ec20 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1ec30 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1ec40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1ec50 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1ec60 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
1ec70 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
1ec80 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
1ec90 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
1eca0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1ecb0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1ecc0 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29    if( !bExtend )
1ecd0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1ece0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  t;.      if( rob
1ecf0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
1ed00 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65  hmNode->h, nByte
1ed10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1ed20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
1ed30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
1ed40 49 5a 45 2c 22 66 74 72 75 6e 63 61 74 65 22 2c  IZE,"ftruncate",
1ed50 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1ed60 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
1ed70 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1ed80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ed90 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
1eda0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1edb0 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
1edc0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1edd0 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
1ede0 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a  apNew = (char **
1edf0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1ee00 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
1ee10 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69  de->apRegion, (i
1ee20 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
1ee30 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a  (char *).    );.
1ee40 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1ee50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ee60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1ee70 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1ee80 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
1ee90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
1eea0 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
1eeb0 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64     while(pShmNod
1eec0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1eed0 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  ion){.      void
1eee0 20 2a 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c   *pMem = mmap(0,
1eef0 20 73 7a 52 65 67 69 6f 6e 2c 20 50 52 4f 54 5f   szRegion, PROT_
1ef00 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
1ef10 20 0a 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f   .          MAP_
1ef20 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
1ef30 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ->h, pShmNode->n
1ef40 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a  Region*szRegion.
1ef50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
1ef60 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
1ef70 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
1ef80 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1ef90 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1efa0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1efb0 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f    }.      pShmNo
1efc0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
1efd0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20  mNode->nRegion] 
1efe0 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53  = pMem;.      pS
1eff0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
1f000 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  +;.    }.  }..sh
1f010 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
1f020 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1f030 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
1f040 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
1f050 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
1f060 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
1f070 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
1f080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f090 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1f0a0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1f0b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
1f0c0 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
1f0d0 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
1f0e0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
1f0f0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1f100 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
1f110 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
1f120 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
1f130 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
1f140 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
1f150 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
1f160 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
1f170 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
1f180 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
1f190 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
1f1a0 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
1f1b0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
1f1c0 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
1f1d0 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
1f1e0 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
1f1f0 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
1f200 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
1f210 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1f220 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
1f230 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1f240 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1f250 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
1f260 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
1f270 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
1f280 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
1f290 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1f2a0 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
1f2b0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1f2c0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f2e0 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
1f2f0 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
1f300 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
1f310 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1f320 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
1f330 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
1f340 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
1f350 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
1f360 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
1f370 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
1f380 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
1f390 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
1f3a0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1f3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1f3c0 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
1f3d0 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
1f3e0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
1f3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1f410 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
1f420 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
1f430 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1f440 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1f450 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
1f460 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
1f470 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
1f480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f4a0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1f4b0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1f4e0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
1f4f0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1f500 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1f510 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
1f520 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
1f530 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
1f540 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
1f550 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
1f560 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
1f570 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
1f580 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
1f590 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
1f5a0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
1f5b0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1f5c0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1f5d0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1f5e0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1f5f0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1f600 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1f610 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1f620 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1f630 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1f640 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1f650 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1f660 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1f670 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1f680 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
1f690 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
1f6a0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
1f6b0 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
1f6c0 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
1f6d0 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
1f6e0 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  st);.  assert( n
1f6f0 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1f700 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1f710 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1f720 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1f730 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1f740 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1f750 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1f760 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1f770 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1f780 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1f790 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1f7a0 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1f7b0 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1f7c0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1f7d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1f7e0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1f7f0 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1f800 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f810 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1f820 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1f830 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1f840 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1f850 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1f860 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1f870 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1f880 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1f890 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1f8a0 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1f8b0 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1f8c0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1f8d0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1f8e0 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  de, F_UNLCK, ofs
1f8f0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
1f900 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1f910 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f920 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
1f930 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
1f940 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
1f950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f960 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
1f970 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1f980 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1f990 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1f9a0 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
1f9b0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1f9c0 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1f9d0 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1f9e0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1f9f0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1fa00 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1fa10 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1fa20 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1fa30 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1fa40 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1fa50 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1fa60 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1fa70 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1fa80 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1fa90 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1faa0 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1fab0 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1fac0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1fad0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1fae0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1faf0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1fb00 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1fb10 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1fb20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1fb30 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1fb40 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1fb50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1fb60 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1fb70 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1fb80 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1fb90 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1fba0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1fbb0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1fbc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fbd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1fbe0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1fbf0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1fc00 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
1fc10 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1fc20 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66  ode, F_RDLCK, of
1fc30 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
1fc40 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
1fc50 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1fc60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1fc70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1fc80 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
1fc90 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
1fca0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fcb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1fcc0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
1fcd0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1fce0 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
1fcf0 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
1fd00 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
1fd10 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
1fd20 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
1fd30 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
1fd40 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
1fd50 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
1fd60 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
1fd70 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1fd80 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1fd90 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1fda0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1fdb0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
1fdc0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
1fdd0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1fde0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1fdf0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1fe00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fe10 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1fe20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
1fe30 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
1fe40 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
1fe50 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
1fe60 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
1fe70 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
1fe80 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
1fe90 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
1fea0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1feb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1fec0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
1fed0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
1fee0 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _WRLCK, ofst+UNI
1fef0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
1ff00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ff10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ff20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
1ff30 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1ff40 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1ff50 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
1ff60 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
1ff70 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1ff80 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1ff90 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1ffa0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1ffb0 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
1ffc0 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30  d-%d got %03x,%0
1ffd0 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
1ffe0 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
1fff0 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ), p->sharedMask
20000 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  , p->exclMask));
20010 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20020 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
20030 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
20040 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
20050 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
20060 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
20070 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
20080 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
20090 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
200a0 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
200b0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
200c0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
200d0 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
200e0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
200f0 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
20100 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20120 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
20130 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
20140 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
20150 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
20160 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  R(fd);.  unixEnt
20170 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69  erMutex();.  uni
20180 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
20190 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
201a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
201b0 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
201c0 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
201d0 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
201e0 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
201f0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
20200 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72  there is no shar
20210 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
20220 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  ated with the co
20230 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68  nnection then th
20240 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
20250 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
20260 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
20270 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20   unixShmUnmap(. 
20280 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
20290 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
202a0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
202b0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
202c0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
202d0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
202e0 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
202f0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66  shared-memory if
20300 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
20310 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  ixShm *p;       
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20330 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
20340 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
20350 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
20360 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
20370 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
20380 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
20390 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  y file */.  unix
203a0 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
203b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
203c0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
203d0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
203e0 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ons */.  unixFil
203f0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
20400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20410 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
20420 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70  ase file */..  p
20430 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
20440 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
20450 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70  d->pShm;.  if( p
20460 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20470 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f  ITE_OK;.  pShmNo
20480 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
20490 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  ;..  assert( pSh
204a0 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
204b0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
204c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
204d0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
204e0 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a  bFd->pInode );..
204f0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
20500 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
20510 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
20520 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
20530 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
20540 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
20550 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
20560 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
20570 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
20580 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
20590 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
205a0 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
205b0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
205c0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
205d0 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
205e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
205f0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
20600 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
20610 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
20620 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
20630 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
20640 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
20650 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
20660 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
20670 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
20680 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78  e, too */.  unix
20690 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
206a0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
206b0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
206c0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
206d0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
206e0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
206f0 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 20  f( deleteFlag ) 
20700 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  unlink(pShmNode-
20710 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
20720 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
20730 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
20740 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
20750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20760 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
20770 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
20780 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
20790 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
207a0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
207b0 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
207c0 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
207d0 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
207e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
207f0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
20800 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
20810 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
20820 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
20830 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
20840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20850 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
20860 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
20870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
20890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
208e0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
208f0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
20900 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
20910 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
20920 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
20930 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
20940 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
20950 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
20960 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
20970 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
20980 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
20990 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
209a0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
209b0 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
209c0 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
209d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
209e0 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
209f0 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
20a00 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
20a10 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
20a20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
20a30 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
20a40 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
20a50 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
20a60 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
20a70 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
20a80 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
20a90 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
20aa0 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
20ab0 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
20ac0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20ad0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
20ae0 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
20af0 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
20b00 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
20b10 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
20b20 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
20b30 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
20b40 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
20b50 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
20b60 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
20b70 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
20b80 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69  For finder-funti
20b90 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
20ba0 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
20bb0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
20bc0 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
20bd0 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
20be0 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
20bf0 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
20c00 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
20c10 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
20c20 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
20c30 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
20c40 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
20c50 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
20c60 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
20c70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
20c80 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
20c90 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
20ca0 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
20cb0 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
20cc0 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
20cd0 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
20ce0 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
20cf0 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
20d00 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
20d10 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
20d20 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
20d30 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
20d40 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
20d50 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
20d60 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
20d70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
20d80 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
20d90 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
20da0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
20db0 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
20dc0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
20dd0 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
20de0 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
20df0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
20e00 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
20e10 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
20e20 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
20e30 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
20e40 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
20e50 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
20e60 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
20e70 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20  FINDER, METHOD, 
20e80 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20  VERSION, CLOSE, 
20e90 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
20ea0 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61  LOCK)      \.sta
20eb0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
20ec0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
20ed0 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
20f00 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
20f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
20f20 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
20f50 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
20f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
20f70 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
20fa0 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
20fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
20fc0 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
20ff0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
21000 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
21010 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
21040 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
21050 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
21060 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
21090 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
210a0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
210b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
210e0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
210f0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
21100 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
211f0 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21210 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
21220 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
21230 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
21240 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21260 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
21270 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
21280 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
21290 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
212b0 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
212c0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
212d0 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
212e0 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
21300 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20    unixShmMap,   
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21320 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21350 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21370 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
213a0 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
213b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
213c0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
213f0 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20  nixShmUnmap     
21400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
21410 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
21490 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
214a0 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
214b0 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
214c0 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20  ar *z, unixFile 
214d0 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45  *p){   \.  UNUSE
214e0 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
214f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
21500 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (p);            
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
21530 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
215d0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
215e0 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
215f0 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
21600 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
21610 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
21620 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
21630 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
21640 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
21650 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
21660 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
21670 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
21680 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
21690 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
216a0 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
216b0 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
216c0 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
216d0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
216e0 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
216f0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
21700 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
21710 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
21720 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
21730 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
21740 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
21750 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  /.  2,          
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21770 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
21780 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  s enabled */.  u
21790 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
217a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
217b0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
217c0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
217d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
217e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
217f0 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
21800 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
21810 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
21820 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
21830 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
21840 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
21850 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
21860 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
21870 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
21880 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
21890 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
218a0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
218b0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
218c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
218d0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
218e0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
218f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
21900 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
21910 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  sabled */.  nolo
21920 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
21930 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
21940 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
21950 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
21960 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
21970 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
21980 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
21990 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
219a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
219b0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
219c0 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
219d0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
219e0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
219f0 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
21a00 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
21a10 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
21a20 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
21a30 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
21a40 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
21a50 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
21a60 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
21a90 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
21aa0 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
21ab0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
21ac0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
21ad0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
21ae0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
21af0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
21b00 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
21b10 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
21b20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
21b30 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
21b40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
21b50 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
21b60 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
21b70 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
21b80 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
21b90 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
21ba0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
21bb0 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21bd0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
21be0 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
21bf0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
21c00 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
21c10 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
21c20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
21c50 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
21c60 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
21c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c80 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
21c90 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
21cc0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
21cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
21ce0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
21cf0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
21d00 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
21d10 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
21d20 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
21d30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
21d40 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
21d50 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
21d60 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
21d70 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
21d80 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
21d90 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
21da0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
21db0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
21dc0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
21df0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
21e00 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f  bled */.  semClo
21e10 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
21e20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
21e30 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63  thod */.  semLoc
21e40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
21e50 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
21e60 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f  hod */.  semUnlo
21e70 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
21e80 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
21e90 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65  thod */.  semChe
21ea0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
21eb0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
21ec0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
21ed0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
21ee0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
21ef0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
21f00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21f10 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
21f20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
21f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
21f40 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
21f50 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
21f60 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
21f70 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
21f80 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
21f90 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
21fc0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
21fd0 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ff0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
22000 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22020 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
22030 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
22040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22050 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
22060 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
22070 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
22080 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
22090 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
220a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
220b0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
220c0 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
220d0 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
220e0 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
220f0 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
22100 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
22110 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
22120 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
22130 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
22140 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
22150 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
22160 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
22170 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
22180 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
22190 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
221a0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
221b0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
221c0 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
221d0 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
221e0 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
221f0 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
22200 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
22210 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
22220 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
22230 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
22240 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
22250 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
22260 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
22270 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
22280 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
22290 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
222a0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
222b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
222c0 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
222d0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
222e0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
222f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
22300 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
22310 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
22320 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
22330 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
22340 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
22350 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
22360 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
22370 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
22380 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
22390 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
223a0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
223b0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
223c0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
223d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
223e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
223f0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
22400 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
22410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
22420 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
22430 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
22440 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
22450 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
22460 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
22470 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
22480 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
22490 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
224a0 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
224b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
224c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
224d0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
224e0 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
224f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
22500 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
22510 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
22520 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
22530 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
22540 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
22550 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
22560 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
22570 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
22580 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
22590 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
225a0 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
225c0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
225d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
225e0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
225f0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
22600 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
22610 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
22640 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
22650 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
22660 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
22670 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
22680 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
22690 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
226a0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
226b0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
226c0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
226d0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
226e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
226f0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
22700 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
22710 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
22720 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
22730 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
22740 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
22750 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
22760 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
22770 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
22780 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
22790 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
227a0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
227b0 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
227c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
227d0 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
227e0 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
227f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22800 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
22810 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
22820 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
22830 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
22840 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
22850 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
22860 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
22870 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
22880 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
22890 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
228a0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
228b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
228c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
228d0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
228e0 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
228f0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
22900 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
22910 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
22920 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
22930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
22940 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
22950 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
22960 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
22970 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
22980 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
22990 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
229a0 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
229b0 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
229c0 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
229d0 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
229e0 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
229f0 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
22a00 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
22a10 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
22a20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
22a30 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
22a40 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
22a50 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
22a60 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
22a70 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
22a80 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
22a90 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
22aa0 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
22ab0 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
22ac0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
22ad0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
22ae0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
22af0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
22b00 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
22b10 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
22b20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
22b30 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
22b40 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
22b50 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
22b60 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
22b70 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
22b80 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
22b90 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
22ba0 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
22bb0 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
22bc0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
22bd0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
22be0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
22bf0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
22c00 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
22c10 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
22c20 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
22c30 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
22c40 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
22c50 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
22c60 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
22c70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22c80 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
22c90 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
22ca0 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
22cb0 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
22cc0 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
22cd0 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
22ce0 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
22cf0 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
22d00 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
22d10 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
22d20 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
22d30 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
22d40 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
22d50 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
22d60 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
22d70 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
22d80 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
22d90 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
22da0 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
22db0 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
22dc0 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
22dd0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
22de0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
22df0 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
22e00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22e10 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
22e20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
22e30 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
22e40 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
22e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
22e60 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
22e70 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
22e80 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
22e90 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
22ea0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
22eb0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
22ec0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
22ed0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
22ee0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
22ef0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
22f00 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
22f10 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22f20 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
22f30 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
22f40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22f50 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
22f60 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
22f70 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
22f80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
22f90 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
22fa0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
22fb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22fc0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
22fd0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
22fe0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
22ff0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
23000 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
23010 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
23020 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
23030 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
23040 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
23050 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23060 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
23070 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
23080 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
23090 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
230a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
230b0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
230c0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
230d0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
230e0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
230f0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
23100 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
23110 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
23120 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
23130 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
23140 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
23150 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
23160 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
23170 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
23180 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
23190 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
231a0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
231b0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
231c0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
231d0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
231e0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
231f0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
23200 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
23210 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
23220 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
23230 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
23240 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
23250 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
23260 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
23270 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
23280 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
23290 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
232a0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
232b0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
232c0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
232d0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
232e0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
232f0 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
23300 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
23310 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
23320 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
23330 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
23340 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
23350 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
23360 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
23370 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
23380 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
23390 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
233a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
233b0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
233c0 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
233d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d  ointer to a IO m
233e0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
233f0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
23400 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
23410 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
23420 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
23430 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
23440 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
23450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23490 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
234a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
234b0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
234c0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
234d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
234f0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
23500 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
23510 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
23520 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
23530 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
23540 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
23550 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
23560 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
23570 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
23580 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
23590 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
235a0 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
235b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
235c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
235d0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
235e0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
235f0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
23600 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
23610 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
23620 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ned */.  int dir
23630 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
23640 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69   /* Directory fi
23650 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
23660 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
23670 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72  *pId,      /* Wr
23680 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46  ite to the unixF
23690 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65  ile structure he
236a0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
236b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
236c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
236d0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
236e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
236f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23700 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66   Omit locking if
23710 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69   true */.  int i
23720 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20 20  sDelete         
23730 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20     /* Delete on 
23740 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f  close if true */
23750 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  .){.  const sqli
23760 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
23770 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
23780 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
23790 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
237a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
237b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
237c0 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  rt( pNew->pInode
237d0 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
237e0 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65  Parameter isDele
237f0 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  te is only used 
23800 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72  on vxworks. Expr
23810 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69  ess this explici
23820 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74  tly .  ** here t
23830 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c  o prevent compil
23840 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75  er warnings abou
23850 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74  t unused paramet
23860 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ers..  */.  UNUS
23870 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
23880 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73  elete);..  /* Us
23890 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
238a0 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
238b0 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
238c0 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
238d0 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
238e0 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
238f0 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
23900 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
23910 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
23920 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
23930 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
23940 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
23950 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
23960 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
23970 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
23980 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
23990 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
239a0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
239b0 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
239c0 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
239d0 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
239e0 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
239f0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
23a00 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
23a10 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
23a20 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
23a30 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
23a40 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
23a50 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
23a60 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64  w->dirfd = dirfd
23a70 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c  ;.  pNew->fileFl
23a80 61 67 73 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ags = 0;.  pNew-
23a90 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
23aa0 6d 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  me;..#if OS_VXWO
23ab0 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
23ac0 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
23ad0 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
23ae0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
23af0 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b  =0 ){.    noLock
23b00 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
23b10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
23b20 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
23b30 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  oLock ){.    pLo
23b40 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
23b50 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
23b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
23b70 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
23b80 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
23b90 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
23ba0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
23bb0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
23bc0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
23bd0 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
23be0 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
23bf0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
23c00 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
23c10 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
23c20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
23c30 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
23c40 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
23c50 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
23c60 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
23c70 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
23c80 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
23c90 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
23ca0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
23cb0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
23cc0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
23cd0 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
23ce0 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
23cf0 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
23d00 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
23d10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
23d20 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
23d30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
23d40 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
23d50 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
23d60 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
23d70 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
23d80 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
23d90 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
23da0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
23db0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
23dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23dd0 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
23de0 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69  or occured in fi
23df0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
23e00 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
23e10 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
23e20 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
23e30 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
23e40 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
23e50 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
23e60 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
23e70 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
23e80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23e90 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
23ea0 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
23eb0 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
23ec0 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
23ed0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
23ee0 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
23ef0 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
23f00 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
23f10 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
23f20 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
23f30 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
23f40 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
23f50 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
23f60 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
23f70 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
23f80 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
23f90 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
23fa0 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
23fb0 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
23fc0 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
23fd0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
23fe0 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
23ff0 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
24000 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
24010 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
24020 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
24030 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
24040 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
24050 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
24060 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
24070 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
24080 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
24090 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
240a0 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
240b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
240c0 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
240d0 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
240e0 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
240f0 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
24100 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
24110 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
24120 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
24130 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
24140 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
24150 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
24160 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
24170 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  E__);.      h = 
24180 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  -1;.    }.    un
24190 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
241a0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
241b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
241c0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
241d0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73  __APPLE__).  els
241e0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
241f0 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  yle == &afpIoMet
24200 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hods ){.    /* A
24210 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  FP locking uses 
24220 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
24230 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
24240 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
24250 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** the afpLockin
24260 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  gContext..    */
24270 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  .    afpLockingC
24280 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
24290 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
242a0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20  ontext = pCtx = 
242b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
242c0 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
242d0 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
242e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
242f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
24300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
24310 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
24320 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
24330 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
24340 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
24350 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
24360 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
24370 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
24380 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
24390 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
243a0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
243b0 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
243c0 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
243d0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
243e0 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
243f0 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
24400 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
24410 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
24420 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
24430 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
24440 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
24450 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
24460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24470 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24480 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
24490 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
244a0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
244b0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
244c0 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
244d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
244e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
244f0 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
24500 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
24510 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
24520 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
24530 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
24540 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
24550 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
24560 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
24570 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
24580 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
24590 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
245a0 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
245b0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
245c0 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
245d0 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  e;.    nFilename
245e0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
245f0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
24600 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
24610 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
24620 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
24630 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46  ;.    if( zLockF
24640 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
24650 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24660 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
24670 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
24680 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
24690 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20  zLockFile, "%s" 
246a0 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20  DOTLOCK_SUFFIX, 
246b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
246c0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  }.    pNew->lock
246d0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f  ingContext = zLo
246e0 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  ckFile;.  }..#if
246f0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c   OS_VXWORKS.  el
24700 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
24710 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65  tyle == &semIoMe
24720 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
24730 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
24740 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
24750 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
24760 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
24770 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   ** included in 
24780 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f  the semLockingCo
24790 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20  ntext.    */.   
247a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
247b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
247c0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
247d0 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
247e0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
247f0 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77  ITE_OK) && (pNew
24800 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d  ->pInode->pSem==
24810 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63  NULL) ){.      c
24820 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20  har *zSemName = 
24830 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
24840 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  emName;.      in
24850 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t n;.      sqlit
24860 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
24870 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61  PATHNAME, zSemNa
24880 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20  me, "/%s.sem",. 
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d        pNew->pId-
248b0 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
248c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31  ;.      for( n=1
248d0 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e  ; zSemName[n]; n
248e0 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28  ++ ).        if(
248f0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f   zSemName[n]=='/
24900 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20  ' ) zSemName[n] 
24910 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65  = '_';.      pNe
24920 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
24930 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e  = sem_open(zSemN
24940 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36  ame, O_CREAT, 06
24950 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  66, 1);.      if
24960 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  ( pNew->pInode->
24970 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c  pSem == SEM_FAIL
24980 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ED ){.        rc
24990 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
249a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
249b0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
249c0 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
249d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
249e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
249f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70   }.#endif.  .  p
24a00 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  New->lastErrno =
24a10 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   0;.#if OS_VXWOR
24a20 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  KS.  if( rc!=SQL
24a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24a40 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
24a50 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
24a60 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20  _LINE__);.    h 
24a70 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  = -1;.    unlink
24a80 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
24a90 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20   isDelete = 0;. 
24aa0 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c   }.  pNew->isDel
24ab0 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a  ete = isDelete;.
24ac0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
24ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24ae0 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
24af0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
24b00 65 77 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  ew, dirfd, __LIN
24b10 45 5f 5f 29 3b 0a 20 20 20 20 69 66 28 20 68 3e  E__);.    if( h>
24b20 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
24b30 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
24b40 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
24b50 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
24b60 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
24b70 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
24b80 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r(+1);.  }.  ret
24b90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24ba0 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
24bb0 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
24bc0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
24bd0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
24be0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
24bf0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
24c00 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
24c10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
24c20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
24c30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
24c40 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
24c50 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
24c60 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
24c70 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
24c80 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
24c90 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
24ca0 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
24cb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
24cc0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24cd0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
24ce0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
24cf0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
24d00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
24d10 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
24d20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
24d30 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
24d40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
24d50 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
24d60 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
24d70 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
24d80 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
24d90 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
24da0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
24db0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
24dc0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
24dd0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
24de0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
24df0 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
24e00 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
24e10 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
24e20 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
24e30 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
24e40 3b 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  ;.    fd = osOpe
24e50 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44  n(zDirname, O_RD
24e60 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  ONLY|O_BINARY, 0
24e70 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  );.    if( fd>=0
24e80 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c   ){.#ifdef FD_CL
24e90 4f 45 58 45 43 0a 20 20 20 20 20 20 6f 73 46 63  OEXEC.      osFc
24ea0 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
24eb0 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
24ec0 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
24ed0 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
24ee0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
24ef0 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e  PENDIR %-3d %s\n
24f00 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  ", fd, zDirname)
24f10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
24f20 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
24f30 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
24f40 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72  _OK:unixLogError
24f50 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
24f60 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
24f70 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a  Dirname));.}../*
24f80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
24f90 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
24fa0 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
24fb0 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
24fc0 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
24fd0 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
24fe0 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
24ff0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
25000 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
25010 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
25020 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
25030 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
25040 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
25050 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
25060 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
25070 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
25080 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
25090 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20  "/tmp",.     0  
250a0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
250b0 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b  rminator */.  };
250c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
250d0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
250e0 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
250f0 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
25100 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
25110 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
25120 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  ory;.  if( !azDi
25130 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
25140 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
25150 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
25160 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
25170 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
25180 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
25190 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
251a0 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
251b0 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
251c0 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
251d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
251e0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
251f0 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
25200 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
25210 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
25220 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25230 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
25240 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
25250 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
25260 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
25270 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
25280 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
25290 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
252a0 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
252b0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
252c0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
252d0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
252e0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
252f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25300 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
25310 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
25320 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
25330 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
25340 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
25350 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
25360 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
25370 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
25380 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
25390 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
253a0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
253b0 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
253c0 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
253d0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
253e0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
253f0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
25400 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
25410 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
25420 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
25430 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
25440 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
25450 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
25460 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
25470 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
25480 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
25490 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
254a0 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
254b0 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
254c0 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
254d0 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
254e0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
254f0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
25500 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
25510 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
25520 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
25530 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
25540 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
25550 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
25560 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
25570 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
25580 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e  _PREFIX) + 17) >
25590 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
255a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
255b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
255c0 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
255d0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
255e0 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  17, zBuf, "%s/"S
255f0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
25600 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
25610 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
25620 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
25630 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
25640 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
25650 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
25660 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
25670 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
25680 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
25690 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
256a0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
256b0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
256c0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
256d0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
256e0 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
256f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
25700 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
25710 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25720 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
25730 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
25740 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
25750 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
25760 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
25770 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
25780 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
25790 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
257a0 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
257b0 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
257c0 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
257d0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
257e0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
257f0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
25800 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
25810 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
25820 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
25830 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
25840 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
25850 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
25860 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
25870 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
25880 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
25890 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
258a0 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
258b0 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
258c0 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
258d0 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
258e0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
258f0 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
25900 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
25910 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
25920 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
25930 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
25940 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
25950 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
25960 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
25970 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
25980 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
25990 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
259a0 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
259b0 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
259c0 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
259d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
259e0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
259f0 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
25a00 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
25a10 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
25a20 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
25a30 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
25a40 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
25a50 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
25a60 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
25a70 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
25a80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
25a90 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
25aa0 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
25ab0 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
25ac0 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
25ad0 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
25ae0 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
25af0 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
25b00 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
25b10 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
25b20 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
25b30 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
25b40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
25b50 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
25b60 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
25b70 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
25b80 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
25b90 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
25ba0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
25bb0 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
25bc0 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
25bd0 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
25be0 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
25bf0 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
25c00 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
25c10 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
25c20 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
25c30 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
25c40 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
25c50 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
25c60 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
25c70 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
25c80 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
25c90 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
25ca0 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
25cb0 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
25cc0 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
25cd0 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
25ce0 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
25cf0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
25d00 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
25d10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
25d20 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
25d30 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
25d40 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
25d50 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
25d60 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
25d70 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
25d80 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
25d90 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
25da0 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
25db0 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
25dc0 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
25dd0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
25de0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
25df0 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
25e00 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
25e10 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
25e20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
25e30 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
25e40 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
25e50 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
25e60 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
25e70 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
25e80 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
25e90 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
25ea0 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
25eb0 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
25ec0 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
25ed0 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
25ee0 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
25ef0 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
25f00 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69  r a resusable fi
25f10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
25f20 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
25f30 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50    if( 0==stat(zP
25f40 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
25f50 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
25f60 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
25f70 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
25f80 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
25f90 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
25fa0 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
25fb0 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
25fc0 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
25fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25fe0 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
25ff0 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
26000 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
26010 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
26020 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
26030 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
26040 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
26050 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
26060 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
26070 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
26080 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
26090 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
260a0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
260b0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
260c0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
260d0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
260e0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
260f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
26100 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
26110 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
26120 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
26130 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
26140 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
26150 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26160 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26170 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
26180 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
26190 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
261a0 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
261b0 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
261c0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
261d0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
261e0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
261f0 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
26200 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
26210 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
26220 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
26230 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
26240 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
26250 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
26260 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26270 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
26280 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
26290 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
262a0 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
262b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
262c0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
262d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
262e0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
262f0 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  created with.** 
26300 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73  the octal permis
26310 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64  sions 0600 (read
26320 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e  /writable by own
26330 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65  er only). If the
26340 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61   file.** is a da
26350 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72  tabase or master
26360 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69   journal file, i
26370 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  t is created wit
26380 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
26390 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54  s .** mask SQLIT
263a0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
263b0 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a  ERMISSIONS..**.*
263c0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  * Finally, if th
263d0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
263e0 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
263f0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
26400 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
26410 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
26420 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
26430 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
26440 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
26450 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
26460 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
26470 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
26480 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
26490 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
264a0 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
264b0 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
264c0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
264d0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
264e0 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
264f0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
26500 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
26510 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
26520 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
26530 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
26540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26550 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
26560 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
26570 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
26580 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
26590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
265a0 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
265b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
265c0 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
265d0 20 2a 70 4d 6f 64 65 20 20 20 20 20 20 20 20 20   *pMode         
265e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
265f0 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
26600 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
26610 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
26620 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
26630 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26640 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20  n Code */.  if( 
26650 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
26660 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
26670 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
26680 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
26690 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
266a0 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
266b0 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
266c0 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
266d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
266f0 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
26700 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  Db */.    struct
26710 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
26720 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
26730 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64  t of stat() on d
26740 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
26750 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73  .    /* zPath is
26760 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c   a path to a WAL
26770 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
26780 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
26790 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20  block derives.  
267a0 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f    ** the path to
267b0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
267c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
267d0 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62  om zPath. This b
267e0 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20  lock handles.   
267f0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
26800 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74  g naming convent
26810 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ions:.    **.   
26820 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
26830 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20  db>-journal".   
26840 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
26850 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20  db>-wal".    ** 
26860 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
26870 6a 6f 75 72 6e 61 6c 2d 4e 4e 4e 4e 22 0a 20 20  journal-NNNN".  
26880 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
26890 20 64 62 3e 2d 77 61 6c 2d 4e 4e 4e 4e 22 0a 20   db>-wal-NNNN". 
268a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
268b0 72 65 20 4e 4e 4e 4e 20 69 73 20 61 20 34 20 64  re NNNN is a 4 d
268c0 69 67 69 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d  igit decimal num
268d0 62 65 72 2e 20 54 68 65 20 4e 4e 4e 4e 20 6e 61  ber. The NNNN na
268e0 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
268f0 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
26900 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
26910 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
26920 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
26930 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
26940 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20  Path) - 1; .    
26950 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20  while( nDb>0 && 
26960 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 6c 27 20  zPath[nDb]!='l' 
26970 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 6e 44 62  ) nDb--;.    nDb
26980 20 2d 3d 20 28 28 66 6c 61 67 73 20 26 20 53 51   -= ((flags & SQ
26990 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f  LITE_OPEN_WAL) ?
269a0 20 33 20 3a 20 37 29 3b 0a 20 20 20 20 6d 65 6d   3 : 7);.    mem
269b0 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20  cpy(zDb, zPath, 
269c0 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44  nDb);.    zDb[nD
269d0 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  b] = '\0';..    
269e0 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 44 62 2c  if( 0==stat(zDb,
269f0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
26a00 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74    *pMode = sStat
26a10 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b  .st_mode & 0777;
26a20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26a30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
26a40 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
26a50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
26a60 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
26a70 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
26a80 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
26a90 36 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  600;.  }else{.  
26aa0 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54    *pMode = SQLIT
26ab0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
26ac0 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a  ERMISSIONS;.  }.
26ad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26ae0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
26af0 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
26b00 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
26b10 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
26b20 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
26b30 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
26b40 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
26b50 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
26b60 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
26b70 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
26b80 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
26b90 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
26ba0 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
26bb0 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
26bc0 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
26bd0 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
26be0 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
26bf0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
26c00 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
26c10 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
26c20 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
26c30 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
26c40 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
26c50 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
26c60 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
26c70 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
26c80 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
26c90 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
26ca0 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
26cb0 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
26cc0 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
26cd0 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
26ce0 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
26cf0 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
26d00 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
26d10 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
26d20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
26d30 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
26d40 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
26d50 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
26d60 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
26d70 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
26d80 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
26d90 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
26da0 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
26db0 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
26dc0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
26dd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
26de0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
26df0 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
26e00 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
26e10 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
26e20 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26e30 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
26e40 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
26e50 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
26e60 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
26e70 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
26e80 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
26e90 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
26ea0 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
26eb0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ed0 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
26ee0 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
26ef0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
26f00 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
26f10 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
26f20 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
26f30 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
26f40 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
26f50 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
26f60 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
26f70 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
26f80 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
26f90 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
26fa0 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
26fb0 20 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31    int dirfd = -1
26fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26fd0 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69   /* Directory fi
26fe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
26ff0 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
27000 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27010 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
27020 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
27030 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
27040 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
27050 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
27060 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
27070 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27090 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
270a0 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
270b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
270c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
270d0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
270e0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a  Return Code */..
270f0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
27100 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
27110 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
27120 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
27130 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
27140 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
27150 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
27160 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
27170 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
27180 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
27190 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
271a0 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
271b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
271c0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
271d0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
271e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
271f0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
27200 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
27210 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
27220 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
27230 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
27240 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
27250 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  Y);.#endif..  /*
27260 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d   If creating a m
27270 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69  aster or main-fi
27280 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73  le journal, this
27290 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f   function will o
272a0 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d  pen.  ** a file-
272b0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
272c0 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e  e directory too.
272d0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
272e0 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20  unixSync().  ** 
272f0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69  is called the di
27300 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
27310 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
27320 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c  fsync()ed and cl
27330 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69  ose()d..  */.  i
27340 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  nt isOpenDirecto
27350 72 79 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  ry = (isCreate &
27360 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70  & (.        eTyp
27370 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
27380 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
27390 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
273a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
273b0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
273c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
273d0 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20  EN_WAL.  ));..  
273e0 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
273f0 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
27400 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
27410 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
27420 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
27430 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
27440 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
27450 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
27460 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
27470 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
27480 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
27490 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
274a0 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a  zName = zPath;..
274b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
274c0 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
274d0 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
274e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
274f0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
27500 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
27510 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
27520 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
27530 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
27540 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
27550 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
27560 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
27570 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
27580 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
27590 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
275a0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
275b0 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
275c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
275d0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
275e0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
275f0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
27600 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
27610 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
27620 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
27630 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
27640 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
27650 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
27660 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
27670 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
27680 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
27690 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
276a0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
276b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
276c0 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
276d0 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
276e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
276f0 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
27700 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
27710 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
27720 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
27730 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
27740 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
27750 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
27760 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
27770 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
27780 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
27790 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
277a0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
277b0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
277c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
277d0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
277e0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
277f0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
27800 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
27810 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
27820 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
27830 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
27840 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
27850 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
27860 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
27870 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
27880 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
27890 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
278a0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
278b0 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
278c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
278d0 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
278e0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
278f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
27900 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
27910 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
27920 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
27930 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
27940 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
27950 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
27960 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
27970 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
27980 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
27990 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
279a0 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
279b0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
279c0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
279d0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
279e0 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
279f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
27a00 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
27a10 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
27a20 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
27a30 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
27a40 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
27a50 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
27a60 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
27a70 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
27a80 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
27a90 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
27aa0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
27ab0 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
27ac0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
27ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27ae0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
27af0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
27b00 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
27b10 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  d;.  }else if( !
27b20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  zName ){.    /* 
27b30 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c  If zName is NULL
27b40 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
27b50 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20  r is requesting 
27b60 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a  a temp file. */.
27b70 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
27b80 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 44 69  ete && !isOpenDi
27b90 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 72 63  rectory);.    rc
27ba0 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61   = unixGetTempna
27bb0 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me(MAX_PATHNAME+
27bc0 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  1, zTmpname);.  
27bd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
27bf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27c00 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61    zName = zTmpna
27c10 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  me;.  }..  /* De
27c20 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
27c30 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70  e of the flags p
27c40 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20  arameter passed 
27c50 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f  to POSIX functio
27c60 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54  n.  ** open(). T
27c70 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c  hese must be cal
27c80 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20  culated even if 
27c90 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  open() is not ca
27ca0 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68  lled, as.  ** th
27cb0 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  ey may be stored
27cc0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
27cd0 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20  file handle and 
27ce0 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a  used by the .  *
27cf0 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c  * 'conch file' l
27d00 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  ocking functions
27d10 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20   later on.  */. 
27d20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
27d30 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  )  openFlags |= 
27d40 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  O_RDONLY;.  if( 
27d50 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70  isReadWrite ) op
27d60 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57  enFlags |= O_RDW
27d70 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74  R;.  if( isCreat
27d80 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  e )    openFlags
27d90 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69   |= O_CREAT;.  i
27da0 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
27db0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
27dc0 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
27dd0 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  );.  openFlags |
27de0 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  = (O_LARGEFILE|O
27df0 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28  _BINARY);..  if(
27e00 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64   fd<0 ){.    mod
27e10 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20  e_t openMode;   
27e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65             /* Pe
27e30 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65  rmissions to cre
27e40 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  ate file with */
27e50 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72  .    rc = findCr
27e60 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61  eateFileMode(zNa
27e70 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e  me, flags, &open
27e80 4d 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Mode);.    if( r
27e90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
27eb0 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20  ->pUnused );.   
27ec0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
27ed0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
27ee0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
27ef0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
27f00 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65  RNAL );.      re
27f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27f20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
27f30 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
27f40 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
27f50 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
27f60 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
27f70 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
27f80 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  nFlags));.    if
27f90 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
27fa0 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
27fb0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
27fc0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
27fd0 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
27fe0 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
27ff0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
28000 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
28010 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
28020 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
28030 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
28040 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
28050 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
28060 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
28070 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
28080 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
28090 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
280a0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
280b0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66 64  RDONLY;.      fd
280c0 20 3d 20 6f 73 4f 70 65 6e 28 7a 4e 61 6d 65 2c   = osOpen(zName,
280d0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
280e0 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
280f0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
28100 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
28110 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28120 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
28130 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
28140 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
28150 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  hed;.    }.  }. 
28160 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29   assert( fd>=0 )
28170 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ;.  if( pOutFlag
28180 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
28190 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
281a0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73  ..  if( p->pUnus
281b0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e  ed ){.    p->pUn
281c0 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
281d0 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
281e0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
281f0 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  }..  if( isDelet
28200 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  e ){.#if OS_VXWO
28210 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  RKS.    zPath = 
28220 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20  zName;.#else.   
28230 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a   unlink(zName);.
28240 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53  #endif.  }.#if S
28250 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28260 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73  KING_STYLE.  els
28270 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c  e{.    p->openFl
28280 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
28290 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
282a0 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f  f( isOpenDirecto
282b0 72 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  ry ){.    rc = o
282c0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
282d0 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
282e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
282f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
28300 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 6c 6f  t is safe to clo
28310 73 65 20 66 64 20 61 74 20 74 68 69 73 20 70 6f  se fd at this po
28320 69 6e 74 2c 20 62 65 63 61 75 73 65 20 69 74 20  int, because it 
28330 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f  is guaranteed no
28340 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  t.      ** to be
28350 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62   open on a datab
28360 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20  ase file. If it 
28370 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64  were open on a d
28380 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 20 20  atabase file,.  
28390 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20      ** it would 
283a0 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 63  not be safe to c
283b0 6c 6f 73 65 20 61 73 20 74 68 69 73 20 77 6f 75  lose as this wou
283c0 6c 64 20 72 65 6c 65 61 73 65 20 61 6e 79 20 6c  ld release any l
283d0 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20 20 20 20  ocks held.      
283e0 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 62  ** on the file b
283f0 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20  y this process. 
28400 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
28410 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  ( eType!=SQLITE_
28420 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
28430 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
28440 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
28450 5f 5f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  __);.      goto 
28460 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
28470 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
28480 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 6f 73   FD_CLOEXEC.  os
28490 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  Fcntl(fd, F_SETF
284a0 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  D, osFcntl(fd, F
284b0 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
284c0 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
284d0 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79  ..  noLock = eTy
284e0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
284f0 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66  MAIN_DB;..  .#if
28500 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
28510 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
28520 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28530 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
28540 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28  fs fsInfo;.  if(
28550 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
28560 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
28570 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
28580 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  File)->lastErrno
28590 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
285a0 28 20 64 69 72 66 64 3e 3d 30 20 29 20 72 6f 62  ( dirfd>=0 ) rob
285b0 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 64 69 72  ust_close(p, dir
285c0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
285d0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
285e0 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
285f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28600 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
28610 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d  ;.  }.  if (0 ==
28620 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22   strncmp("msdos"
28630 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
28640 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
28650 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
28660 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
28670 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
28680 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e  S_MSDOS;.  }.#en
28690 64 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54  dif.  .#if SQLIT
286a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
286b0 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54  _STYLE.#if SQLIT
286c0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
286d0 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50  OCKING.  isAutoP
286e0 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  roxy = 1;.#endif
286f0 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f  .  if( isAutoPro
28700 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55  xy && (zPath!=NU
28710 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29  LL) && (!noLock)
28720 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20   && pVfs->xOpen 
28730 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76  ){.    char *env
28740 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22  force = getenv("
28750 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
28760 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20  XY_LOCKING");.  
28770 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d    int useProxy =
28780 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49   0;..    /* SQLI
28790 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
287a0 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20  OCKING==1 means 
287b0 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65  force always use
287c0 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20   proxy, 0 means 
287d0 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73  .    ** never us
287e0 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65  e proxy, NULL me
287f0 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f  ans use proxy fo
28800 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  r non-local file
28810 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20  s only.  */.    
28820 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55  if( envforce!=NU
28830 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50  LL ){.      useP
28840 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66  roxy = atoi(envf
28850 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c  orce)>0;.    }el
28860 73 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  se{.      struct
28870 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
28880 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66 73        if( statfs
28890 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  (zPath, &fsInfo)
288a0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
288b0 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
288c0 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61  the close(fd) ca
288d0 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61  ll is sub-optima
288e0 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  l. If the file o
288f0 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  pened.        **
28900 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64 61   with fd is a da
28910 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
28920 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
28930 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65   connections ope
28940 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
28950 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
28960 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c  re currently hol
28970 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f  ding advisory lo
28980 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20  cks on it,.     
28990 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63     ** then the c
289a0 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77  all to close() w
289b0 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65  ill cancel those
289c0 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74   locks. In pract
289d0 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ice,.        ** 
289e0 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74  we're assuming t
289f0 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f 65  hat statfs() doe
28a00 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f  sn't fail very o
28a10 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20  ften. At least. 
28a20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68         ** not wh
28a30 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64  ile other file d
28a40 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
28a50 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  d by the same pr
28a60 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20  ocess on.       
28a70 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c   ** the same fil
28a80 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20  e are working.  
28a90 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61  */.        p->la
28aa0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
28ab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 69 72  .        if( dir
28ac0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fd>=0 ){.       
28ad0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
28ae0 70 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45  p, dirfd, __LINE
28af0 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  __);.        }. 
28b00 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
28b10 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
28b20 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  E__);.        rc
28b30 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
28b40 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20  ACCESS;.        
28b50 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
28b60 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
28b70 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
28b80 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
28b90 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
28ba0 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
28bb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
28bc0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
28bd0 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70  fs, fd, dirfd, p
28be0 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c  File, zPath, noL
28bf0 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a  ock, isDelete);.
28c00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28c20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
28c30 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
28c40 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
28c50 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
28c60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28c80 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
28c90 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
28ca0 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
28cb0 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
28cc0 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
28cd0 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
28ce0 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
28cf0 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
28d00 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
28d10 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
28d20 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
28d30 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
28d40 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
28d50 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
28d60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28d70 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
28d80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
28d90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28da0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
28db0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
28dc0 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
28dd0 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20  endif.  .  rc = 
28de0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
28df0 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
28e00 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
28e10 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
28e20 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
28e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
28e50 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
28e60 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
28e70 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
28e80 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
28e90 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
28ea0 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
28eb0 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
28ec0 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
28ed0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
28ee0 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
28ef0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
28f00 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
28f10 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
28f20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
28f30 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
28f40 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
28f50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28f60 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
28f70 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
28f80 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
28f90 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28fb0 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
28fc0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
28fd0 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
28fe0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
28ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
29000 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
29010 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
29020 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
29030 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
29040 45 54 45 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  ETE);.  if( unli
29050 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20  nk(zPath)==(-1) 
29060 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54  && errno!=ENOENT
29070 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 75   ){.    return u
29080 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
29090 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
290a0 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68   "unlink", zPath
290b0 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
290c0 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
290d0 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53  RSYNC.  if( dirS
290e0 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ync ){.    int f
290f0 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  d;.    rc = open
29100 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
29110 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72   &fd);.    if( r
29120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29130 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
29140 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
29150 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20  d)==-1 ).#else. 
29160 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
29170 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  d) ).#endif.    
29180 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d    {.        rc =
29190 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
291a0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
291b0 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a  SYNC, "fsync", z
291c0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
291d0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
291e0 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
291f0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
29200 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
29210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
29220 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
29230 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
29240 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
29250 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
29260 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
29270 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
29280 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
29290 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
292a0 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
292b0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
292c0 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
292d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
292e0 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
292f0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
29300 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
29310 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
29320 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
29330 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29340 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
29350 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
29360 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
29370 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
29380 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
29390 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
293a0 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74   /* The VFS cont
293b0 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63  aining this xAcc
293c0 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ess method */.  
293d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
293e0 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20  h,      /* Path 
293f0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65  of the file to e
29400 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  xamine */.  int 
29410 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
29420 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77      /* What do w
29430 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20  e want to learn 
29440 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20  about the zPath 
29450 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a  file? */.  int *
29460 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
29470 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
29480 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20  lt boolean here 
29490 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  */.){.  int amod
294a0 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  e = 0;.  UNUSED_
294b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
294c0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
294d0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
294e0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
294f0 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  S; );.  switch( 
29500 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
29510 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
29520 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d  EXISTS:.      am
29530 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20  ode = F_OK;.    
29540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
29550 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
29560 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
29570 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f   amode = W_OK|R_
29580 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
29590 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
295a0 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
295b0 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
295c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
295d0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
295e0 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
295f0 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
29600 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
29610 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73  sOut = (osAccess
29620 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d  (zPath, amode)==
29630 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d  0);.  if( flags=
29640 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
29650 58 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75  XISTS && *pResOu
29660 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
29670 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66  stat buf;.    if
29680 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c  ( 0==stat(zPath,
29690 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74   &buf) && buf.st
296a0 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _size==0 ){.    
296b0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
296c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
296d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
296e0 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
296f0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
29700 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
29710 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
29720 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
29730 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
29740 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
29750 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
29760 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
29770 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
29780 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
29790 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
297a0 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
297b0 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
297c0 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
297d0 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
297e0 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
297f0 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
29800 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
29810 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
29820 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
29830 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
29840 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
29850 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
29860 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
29870 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
29880 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
29890 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
298a0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
298b0 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
298c0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
298f0 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
29900 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
29910 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
29920 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
29930 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
29940 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
29950 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
29960 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
29970 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
29980 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
29990 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
299a0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
299b0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
299c0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
299d0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
299e0 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
299f0 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
29a00 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
29a10 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
29a20 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
29a30 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
29a40 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
29a50 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
29a60 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
29a70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  ;..  assert( pVf
29a80 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d  s->mxPathname==M
29a90 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20  AX_PATHNAME );. 
29aa0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29ab0 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74  R(pVfs);..  zOut
29ac0 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nOut-1] = '\0';
29ad0 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
29ae0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='/' ){.    sqli
29af0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
29b00 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
29b10 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
29b20 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
29b30 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
29b40 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20  Out, nOut-1)==0 
29b50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29b60 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
29b70 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
29b80 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
29b90 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  th);.    }.    n
29ba0 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Cwd = (int)strle
29bb0 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
29bc0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
29bd0 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
29be0 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
29bf0 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
29c00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29c20 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
29c30 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
29c40 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
29c50 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
29c60 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
29c70 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
29c80 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
29c90 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
29ca0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
29cb0 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
29cc0 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
29cd0 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
29ce0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
29cf0 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
29d00 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
29d10 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
29d20 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
29d30 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
29d40 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
29d50 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
29d60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
29d70 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
29d80 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
29d90 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
29da0 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
29db0 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
29dc0 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
29dd0 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
29de0 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
29df0 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
29e00 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
29e10 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
29e20 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
29e30 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
29e40 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
29e50 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
29e60 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
29e70 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
29e80 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
29e90 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
29ea0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
29eb0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
29ec0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
29ed0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
29ee0 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ut){.  const cha
29ef0 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45  r *zErr;.  UNUSE
29f00 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
29f10 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  sed);.  unixEnte
29f20 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
29f30 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
29f40 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
29f50 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29f60 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
29f70 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
29f80 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
29f90 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
29fa0 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73  id (*unixDlSym(s
29fb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
29fc0 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  sed, void *p, co
29fd0 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
29fe0 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  void){.  /* .  *
29ff0 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61  * GCC with -peda
2a000 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73  ntic-errors says
2a010 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e   that C90 does n
2a020 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a  ot allow a void*
2a030 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74   to be.  ** cast
2a040 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
2a050 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
2a060 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72  And yet the libr
2a070 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74  ary dlsym() rout
2a080 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ine.  ** returns
2a090 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69   a void* which i
2a0a0 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74  s really a point
2a0b0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2a0c0 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a  .  So how do we.
2a0d0 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29    ** use dlsym()
2a0e0 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
2a0f0 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a  errors?.  **.  *
2a100 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c  * Variable x bel
2a110 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ow is defined to
2a120 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
2a130 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69   a function taki
2a140 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  ng.  ** paramete
2a150 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e  rs void* and con
2a160 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74  st char* and ret
2a170 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  urning a pointer
2a180 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a   to a function..
2a190 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69    ** We initiali
2a1a0 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e  ze x by assignin
2a1b0 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74  g it a pointer t
2a1c0 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75  o the dlsym() fu
2a1d0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68  nction..  ** (Th
2a1e0 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65  at assignment re
2a1f0 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20  quires a cast.) 
2a200 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68   Then we call th
2a210 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  e function that.
2a220 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f    ** x points to
2a230 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
2a240 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  is work-around i
2a250 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f  s unlikely to wo
2a260 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  rk correctly on 
2a270 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65  any system where
2a280 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79  .  ** you really
2a290 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66   cannot cast a f
2a2a0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
2a2b0 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74  into void*.  But
2a2c0 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20   then, on the.  
2a2d0 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64  ** other hand, d
2a2e0 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20  lsym() will not 
2a2f0 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73  work on such a s
2a300 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f  ystem either, so
2a310 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f   we have.  ** no
2a320 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e  t really lost an
2a330 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76  ything..  */.  v
2a340 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a  oid (*(*x)(void*
2a350 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
2a360 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  oid);.  UNUSED_P
2a370 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2a380 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a  );.  x = (void(*
2a390 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  (*)(void*,const 
2a3a0 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c  char*))(void))dl
2a3b0 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a  sym;.  return (*
2a3c0 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  x)(p, zSym);.}.s
2a3d0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
2a3e0 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
2a3f0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
2a400 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
2a410 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a420 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
2a430 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
2a440 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
2a450 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2a460 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
2a470 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
2a480 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
2a490 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
2a4a0 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
2a4b0 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
2a4c0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
2a4d0 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
2a4e0 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
2a4f0 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
2a500 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
2a510 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
2a520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2a530 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
2a540 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2a550 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
2a560 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
2a570 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2a580 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
2a590 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
2a5a0 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
2a5b0 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
2a5c0 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
2a5d0 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
2a5e0 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
2a5f0 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
2a600 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
2a610 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
2a620 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
2a630 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
2a640 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
2a650 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
2a660 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
2a670 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
2a680 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
2a690 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
2a6a0 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
2a6b0 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
2a6c0 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
2a6d0 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
2a6e0 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
2a6f0 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
2a700 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
2a710 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
2a720 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
2a730 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
2a740 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
2a750 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
2a760 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
2a770 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
2a780 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
2a790 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
2a7a0 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
2a7b0 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
2a7c0 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
2a7d0 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
2a7e0 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
2a7f0 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
2a800 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
2a810 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
2a820 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
2a830 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
2a840 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
2a850 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2a860 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
2a870 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20  pid, fd;.    fd 
2a880 3d 20 6f 73 4f 70 65 6e 28 22 2f 64 65 76 2f 75  = osOpen("/dev/u
2a890 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
2a8a0 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
2a8b0 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d  d<0 ){.      tim
2a8c0 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d  e_t t;.      tim
2a8d0 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e(&t);.      mem
2a8e0 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69  cpy(zBuf, &t, si
2a8f0 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20  zeof(t));.      
2a900 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a  pid = getpid();.
2a910 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42        memcpy(&zB
2a920 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26  uf[sizeof(t)], &
2a930 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
2a940 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a950 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f   sizeof(t)+sizeo
2a960 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29  f(pid)<=(size_t)
2a970 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42  nBuf );.      nB
2a980 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b  uf = sizeof(t) +
2a990 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
2a9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
2a9b0 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65 61 64  o{ nBuf = osRead
2a9c0 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
2a9d0 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66 3c 30  ; }while( nBuf<0
2a9e0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
2a9f0 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   );.      robust
2aa00 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
2aa10 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
2aa20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2aa30 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nBuf;.}.../*.
2aa40 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
2aa50 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
2aa60 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
2aa70 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
2aa80 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
2aa90 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2aaa0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20  microseconds we 
2aab0 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a  want to sleep..*
2aac0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2aad0 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2aae0 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
2aaf0 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c   of sleep actual
2ab00 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  ly.** requested 
2ab10 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
2ab20 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
2ab30 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77  stem, a number w
2ab40 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
2ab50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
2ab60 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72   equal to the ar
2ab70 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  gument, but not 
2ab80 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65  less.** than the
2ab90 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
2aba0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65  atic int unixSle
2abb0 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
2abc0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63  NotUsed, int mic
2abd0 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
2abe0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2abf0 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b  uct timespec sp;
2ac00 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20  ..  sp.tv_sec = 
2ac10 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31  microseconds / 1
2ac20 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f  000000;.  sp.tv_
2ac30 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63  nsec = (microsec
2ac40 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20  onds % 1000000) 
2ac50 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c  * 1000;.  nanosl
2ac60 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a  eep(&sp, NULL);.
2ac70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ac80 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2ac90 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
2aca0 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  ds;.#elif define
2acb0 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
2acc0 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  & HAVE_USLEEP.  
2acd0 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f  usleep(microseco
2ace0 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
2acf0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2ad00 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
2ad10 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a  oseconds;.#else.
2ad20 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20    int seconds = 
2ad30 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39  (microseconds+99
2ad40 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20  9999)/1000000;. 
2ad50 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b   sleep(seconds);
2ad60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ad70 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2ad80 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31  return seconds*1
2ad90 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d  000000;.#endif.}
2ada0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2adb0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
2adc0 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
2add0 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
2ade0 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
2adf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2ae00 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2ae10 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
2ae20 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
2ae30 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
2ae40 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
2ae50 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
2ae60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2ae70 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
2ae80 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
2ae90 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
2aea0 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
2aeb0 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
2aec0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
2aed0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2aee0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2aef0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2af00 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
2af10 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
2af20 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2af30 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2af40 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
2af50 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
2af60 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
2af70 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
2af80 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
2af90 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
2afa0 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
2afb0 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
2afc0 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
2afd0 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
2afe0 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
2aff0 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
2b000 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
2b010 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
2b020 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
2b030 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
2b040 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2b050 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
2b060 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
2b070 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
2b080 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
2b090 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71  vfs *NotUsed, sq
2b0a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
2b0b0 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ow){.  static co
2b0c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2b0d0 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
2b0e0 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
2b0f0 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
2b100 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45  if defined(NO_GE
2b110 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74  TTOD).  time_t t
2b120 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
2b130 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74  *piNow = ((sqlit
2b140 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30  e3_int64)t)*1000
2b150 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65   + unixEpoch;.#e
2b160 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  lif OS_VXWORKS. 
2b170 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2b180 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67   sNow;.  clock_g
2b190 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41  ettime(CLOCK_REA
2b1a0 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20  LTIME, &sNow);. 
2b1b0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
2b1c0 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
2b1d0 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
2b1e0 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
2b1f0 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65  nsec/1000000;.#e
2b200 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d  lse.  struct tim
2b210 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74  eval sNow;.  get
2b220 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
2b230 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20   0);.  *piNow = 
2b240 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
2b250 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2b260 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
2b270 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
2b280 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
2b290 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
2b2a0 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
2b2b0 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
2b2c0 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
2b2d0 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
2b2e0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2b2f0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
2b300 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
2b310 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2b320 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ed);.  return 0;
2b330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
2b340 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2b350 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2b360 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2b370 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
2b380 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2b390 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2b3a0 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
2b3b0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
2b3c0 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
2b3d0 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
2b3e0 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
2b3f0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2b400 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
2b410 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
2b420 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75  fs *NotUsed, dou
2b430 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73  ble *prNow){.  s
2b440 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
2b450 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b460 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75  ER(NotUsed);.  u
2b470 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
2b480 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
2b490 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
2b4a0 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0.0;.  return 0;
2b4b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64  .}../*.** We add
2b4c0 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45  ed the xGetLastE
2b4d0 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69  rror() method wi
2b4e0 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e  th the intention
2b4f0 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a   of providing.**
2b500 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65   better low-leve
2b510 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  l error messages
2b520 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d   when operating-
2b530 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20  system problems 
2b540 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e  come up.** durin
2b550 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69  g SQLite operati
2b560 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c  on.  But so far,
2b570 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61   none of that ha
2b580 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
2b590 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72  ed.** in the cor
2b5a0 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74  e.  So this rout
2b5b0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
2b5c0 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69  led.  For now, i
2b5d0 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61  t is merely.** a
2b5e0 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a   place-holder..*
2b5f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2b600 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
2b610 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2b620 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
2b630 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
2b640 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b650 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2b660 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b670 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
2b680 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b690 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
2b6a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
2b6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b6c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
2b6d0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
2b6e0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
2b6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2b700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
2b750 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2b760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2b7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
2b7c0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
2b7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2b7f0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
2b800 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
2b810 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
2b820 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
2b830 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
2b840 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
2b850 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
2b860 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
2b870 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
2b880 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
2b890 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
2b8a0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
2b8b0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
2b8c0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
2b8d0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
2b8e0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
2b8f0 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
2b900 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
2b910 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
2b920 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
2b930 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
2b940 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
2b950 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
2b960 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
2b970 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
2b980 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
2b990 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
2b9a0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
2b9b0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
2b9c0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2b9d0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
2b9e0 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
2b9f0 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
2ba00 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
2ba10 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
2ba20 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
2ba30 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
2ba40 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
2ba50 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
2ba60 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
2ba70 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
2ba80 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
2ba90 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
2baa0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
2bab0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
2bac0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
2bad0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
2bae0 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
2baf0 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
2bb00 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
2bb10 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
2bb20 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
2bb30 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
2bb40 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
2bb50 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
2bb60 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
2bb70 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
2bb80 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
2bb90 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
2bba0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
2bbb0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
2bbc0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
2bbd0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
2bbe0 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
2bbf0 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
2bc00 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
2bc10 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
2bc20 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
2bc30 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
2bc40 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
2bc50 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
2bc60 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
2bc70 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
2bc80 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
2bc90 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
2bca0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
2bcb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
2bcc0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
2bcd0 30 78 34 30 30 30 30 30 30 30 09 09 20 20 20 09  0x40000000..   .
2bce0 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
2bcf0 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
2bd00 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
2bd10 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
2bd20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
2bd30 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
2bd40 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
2bd50 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
2bd60 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
2bd70 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
2bd80 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
2bd90 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
2bda0 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
2bdb0 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
2bdc0 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
2bdd0 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
2bde0 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
2bdf0 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
2be00 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
2be10 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
2be20 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
2be30 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
2be40 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
2be50 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
2be60 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
2be70 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
2be80 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
2be90 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
2bea0 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
2beb0 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
2bec0 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
2bed0 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
2bee0 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
2bef0 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
2bf00 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
2bf10 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
2bf20 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
2bf30 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
2bf40 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
2bf50 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
2bf60 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
2bf70 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
2bf80 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
2bf90 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
2bfa0 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
2bfb0 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
2bfc0 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
2bfd0 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
2bfe0 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
2bff0 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
2c000 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
2c010 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
2c020 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
2c030 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
2c040 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
2c050 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
2c060 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
2c070 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
2c080 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
2c090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c0a0 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
2c0b0 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
2c0c0 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
2c0d0 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
2c0e0 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
2c0f0 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
2c100 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
2c110 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
2c120 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
2c130 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
2c140 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
2c150 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
2c170 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
2c180 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
2c190 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2c1a0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
2c1b0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
2c1c0 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70  YFILE, &<proxy_p
2c1d0 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ath>);.**.**.** 
2c1e0 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a  SQL pragmas.**.*
2c1f0 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
2c200 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
2c210 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68  file=<proxy_path
2c220 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50  > | :auto:.**  P
2c230 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
2c240 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
2c250 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e  .**.** Specifyin
2c260 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73  g ":auto:" means
2c270 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
2c280 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  s a conch file w
2c290 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
2c2a0 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c  * host ID in it,
2c2b0 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20   the proxy path 
2c2c0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
2c2d0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  e will be used, 
2c2e0 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70  otherwise.** a p
2c2f0 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20  roxy path based 
2c300 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65  on the user's te
2c310 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63  mp dir.** (via c
2c320 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
2c330 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
2c340 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73  ...)) will be us
2c350 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63  ed and the.** ac
2c360 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20  tual proxy file 
2c370 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65  name is generate
2c380 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20  d from the name 
2c390 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a  and path of the.
2c3a0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2c3b0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2c3c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20  **.**       For 
2c3d0 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f  database path "/
2c3e0 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22  Users/me/foo.db"
2c3f0 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c   .**       The l
2c400 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
2c410 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74   "<tmpdir>/sqlit
2c420 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d  eplocks/_Users_m
2c430 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29  e_foo.db:auto:")
2c440 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f  .**.** Once a lo
2c450 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66  ck proxy is conf
2c460 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74  igured for a dat
2c470 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2c480 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20  , it can not.** 
2c490 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65  be removed, howe
2c4a0 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77  ver it may be sw
2c4b0 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66  itched to a diff
2c4c0 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68  erent proxy path
2c4d0 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76   via.** the abov
2c4e0 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67  e APIs (assuming
2c4f0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2c500 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c  is not being hel
2c510 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  d by another.** 
2c520 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72  connection or pr
2c530 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a  ocess). .**.**.*
2c540 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b  * How proxy lock
2c550 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d  ing works.** ---
2c560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c570 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ----.**.** Proxy
2c580 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65   file locking re
2c590 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f  lies primarily o
2c5a0 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72  n two new suppor
2c5b0 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a  ting files: .**.
2c5c0 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69  **   *  conch fi
2c5d0 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65  le to limit acce
2c5e0 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
2c5f0 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e  se file to a sin
2c600 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20  gle host.**     
2c610 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   at a time.**.**
2c620 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65     *  proxy file
2c630 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f   to act as a pro
2c640 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73  xy for the advis
2c650 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c  ory locks normal
2c660 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e  ly.**      taken
2c670 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2c680 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68  .**.** The conch
2c690 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61   file - to use a
2c6a0 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c   proxy file, sql
2c6b0 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22  ite must first "
2c6c0 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a  hold the conch".
2c6d0 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20  ** by taking an 
2c6e0 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61  sqlite-style sha
2c6f0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2c700 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64  conch file, read
2c710 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
2c720 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e  nts and comparin
2c730 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69  g the host's uni
2c740 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65  que host ID (see
2c750 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b   below) and lock
2c760 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61  .** proxy path a
2c770 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65  gainst the value
2c780 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
2c790 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63  conch.  The conc
2c7a0 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f  h file is.** sto
2c7b0 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
2c7c0 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
2c7d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2c7e0 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  nd the file name
2c7f0 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64  .** is patterned
2c800 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
2c810 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ase file name as
2c820 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65   ".<databasename
2c830 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20  >-conch"..** If 
2c840 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  the conch file d
2c850 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
2c860 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20  r it's contents 
2c870 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
2c880 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
2c890 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
2c8a0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
2c8b0 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
2c8c0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
2c8d0 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
2c8e0 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
2c8f0 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
2c900 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
2c910 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
2c920 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
2c930 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
2c940 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
2c950 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
2c960 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
2c970 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
2c980 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
2c990 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
2c9a0 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
2c9b0 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
2c9c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2c9d0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
2c9e0 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
2c9f0 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
2ca00 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
2ca10 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
2ca20 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
2ca30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ca40 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
2ca50 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
2ca60 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
2ca70 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
2ca80 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
2ca90 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
2caa0 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
2cab0 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
2cac0 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
2cad0 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
2cae0 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
2caf0 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
2cb00 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
2cb10 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
2cb20 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
2cb30 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
2cb40 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
2cb50 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
2cb60 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
2cb70 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
2cb80 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
2cb90 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
2cba0 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
2cbb0 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
2cbc0 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
2cbd0 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
2cbe0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
2cbf0 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
2cc00 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
2cc10 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
2cc20 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
2cc30 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2cc40 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
2cc50 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
2cc60 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
2cc70 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
2cc80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
2cc90 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
2cca0 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
2ccb0 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
2ccc0 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
2ccd0 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
2cce0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
2ccf0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
2cd00 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
2cd10 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
2cd20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2cd30 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
2cd40 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2cd50 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
2cd60 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
2cd70 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
2cd80 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
2cd90 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
2cda0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
2cdb0 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
2cdc0 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
2cdd0 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
2cde0 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
2cdf0 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
2ce00 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
2ce10 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
2ce20 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
2ce30 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
2ce40 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
2ce50 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
2ce60 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
2ce70 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
2ce80 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
2ce90 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
2cea0 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
2ceb0 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
2cec0 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
2ced0 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
2cee0 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
2cef0 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
2cf00 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
2cf10 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
2cf20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
2cf30 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
2cf40 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
2cf50 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
2cf60 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
2cf70 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
2cf80 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
2cf90 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
2cfa0 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
2cfb0 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
2cfc0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
2cfd0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
2cfe0 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
2cff0 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
2d000 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
2d010 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
2d020 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
2d030 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
2d040 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
2d050 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
2d060 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
2d070 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
2d080 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
2d090 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
2d0a0 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
2d0b0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
2d0c0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
2d0d0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
2d0e0 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
2d0f0 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
2d100 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
2d110 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
2d120 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
2d130 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
2d140 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69  (explicity calli
2d150 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45  ng the SQLITE_SE
2d160 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
2d170 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c  pragma or.** sql
2d180 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ite_file_control
2d190 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65   API is not affe
2d1a0 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46  cted by SQLITE_F
2d1b0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
2d1c0 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  NG)..*/../*.** P
2d1d0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2d1e0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
2d1f0 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66  n MacOSX .*/.#if
2d200 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2d210 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2d220 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d230 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  LE../*.** The pr
2d240 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2d250 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61  t has the path a
2d260 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  nd file structur
2d270 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74  es for the remot
2d280 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20  e .** and local 
2d290 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69  proxy files in i
2d2a0 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
2d2b0 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
2d2c0 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63  Context proxyLoc
2d2d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
2d2e0 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
2d2f0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78  Context {.  unix
2d300 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
2d310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2d320 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
2d330 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65   char *conchFile
2d340 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
2d350 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
2d360 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ch file */.  uni
2d370 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
2d380 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
2d390 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  n proxy lock fil
2d3a0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
2d3b0 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20  kProxyPath;     
2d3c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d3d0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
2d3e0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62  le */.  char *db
2d3f0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
2d400 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2d410 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
2d420 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64  .  int conchHeld
2d430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d440 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63  /* 1 if the conc
2d450 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66  h is held, -1 if
2d460 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76   lockless */.  v
2d470 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43  oid *oldLockingC
2d480 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f  ontext;     /* O
2d490 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63  riginal lockingc
2d4a0 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72  ontext to restor
2d4b0 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  e on close */.  
2d4c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2d4d0 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65  ds const *pOldMe
2d4e0 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69  thod;     /* Ori
2d4f0 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64  ginal I/O method
2d500 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d  s for close */.}
2d510 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72  ;../* .** The pr
2d520 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  oxy lock file pa
2d530 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  th for the datab
2d540 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73  ase at dbPath is
2d550 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50   written into lP
2d560 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d  ath, .** which m
2d570 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c  ust point to val
2d580 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d  id, writable mem
2d590 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ory large enough
2d5a0 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65   for a maxLen le
2d5b0 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74  ngth.** file pat
2d5c0 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h. .*/.static in
2d5d0 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
2d5e0 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
2d5f0 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
2d600 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
2d610 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
2d620 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
2d630 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
2d640 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
2d650 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
2d660 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
2d670 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
2d680 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
2d690 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
2d6a0 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66   {.    if( !conf
2d6b0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
2d6c0 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
2d6d0 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a  ath, maxLen) ){.
2d6e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
2d6f0 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69  GETLOCKPATH  fai
2d700 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20  led %s errno=%d 
2d710 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
2d720 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c            lPath,
2d730 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29   errno, getpid()
2d740 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
2d750 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2d760 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  CK;.    }.    le
2d770 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
2d780 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73  h, "sqliteplocks
2d790 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a  ", maxLen);    .
2d7a0 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
2d7b0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
2d7c0 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
2d7d0 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
2d7e0 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
2d7f0 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
2d800 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
2d810 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
2d820 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
2d830 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
2d840 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
2d850 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
2d860 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
2d870 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
2d880 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
2d890 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
2d8a0 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69  )<(int)maxLen; i
2d8b0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  ++){.    char c 
2d8c0 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  = dbPath[i];.   
2d8d0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20   lPath[i+len] = 
2d8e0 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a  (c=='/')?'_':c;.
2d8f0 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65    }.  lPath[i+le
2d900 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63  n]='\0';.  strlc
2d910 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f  at(lPath, ":auto
2d920 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f  :", maxLen);.  O
2d930 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
2d940 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
2d950 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2d960 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69  n", lPath, getpi
2d970 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
2d980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d990 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
2d9a0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
2d9b0 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
2d9c0 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
2d9d0 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
2d9e0 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
2d9f0 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
2da00 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
2da10 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
2da20 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
2da30 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
2da40 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
2da50 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
2da60 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
2da70 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
2da80 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
2da90 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
2daa0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
2dab0 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
2dac0 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
2dad0 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
2dae0 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
2daf0 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
2db00 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
2db10 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
2db20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
2db30 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
2db40 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
2db50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
2db60 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
2db70 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
2db80 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
2db90 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
2dba0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
2dbb0 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
2dbc0 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
2dbd0 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
2dbe0 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
2dbf0 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
2dc00 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64 69          if( mkdi
2dc10 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45  r(buf, SQLITE_DE
2dc20 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
2dc30 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20  ERMISSIONS) ){. 
2dc40 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
2dc50 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
2dc60 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
2dc70 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  T ) {.          
2dc80 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
2dc90 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c  TELOCKPATH  FAIL
2dca0 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20  ED creating %s, 
2dcb0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2dcc0 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f         "'%s' pro
2dcd0 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
2dce0 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd00 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72  buf, strerror(er
2dd10 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  r), lockPath, ge
2dd20 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
2dd30 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72        return err
2dd40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2dd50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2dd60 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b        start=i+1;
2dd70 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69  .    }.    buf[i
2dd80 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b  ] = lockPath[i];
2dd90 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
2dda0 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
2ddb0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2ddc0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
2ddd0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
2dde0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  )));.  return 0;
2ddf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2de00 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20   a new VFS file 
2de10 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72  descriptor (stor
2de20 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
2de30 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
2de40 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e  lite3_malloc) an
2de50 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  d open the file 
2de60 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20  named "path" in 
2de70 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2de80 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tor..**.** The c
2de90 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
2dea0 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f  ible not only fo
2deb0 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69  r closing the fi
2dec0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
2ded0 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72   but also for fr
2dee0 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79  eeing the memory
2def0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2df00 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2df10 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
2df20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55  int proxyCreateU
2df30 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e  nixFile(.    con
2df40 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
2df50 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f        /* path fo
2df60 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  r the new unixFi
2df70 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69  le */.    unixFi
2df80 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20  le **ppFile,    
2df90 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63     /* unixFile c
2dfa0 72 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72  reated and retur
2dfb0 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20  ned by ref */.  
2dfc0 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65    int islockfile
2dfd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66             /* if
2dfe0 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e   non zero missin
2dff0 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63  g dirs will be c
2e000 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20  reated */.) {.  
2e010 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69  int fd = -1;.  i
2e020 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  nt dirfd = -1;. 
2e030 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
2e040 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e050 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
2e060 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
2e070 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
2e080 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
2e090 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
2e0a0 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
2e0b0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
2e0c0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
2e0d0 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
2e0e0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
2e0f0 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
2e100 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
2e110 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
2e120 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
2e130 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
2e140 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
2e150 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
2e160 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
2e170 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
2e180 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
2e190 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
2e1a0 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
2e1b0 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
2e1c0 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
2e1d0 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
2e1e0 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
2e1f0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
2e200 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
2e210 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
2e220 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
2e230 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
2e240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
2e250 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
2e260 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
2e270 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66  Unused));.    if
2e280 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2e290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e2a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2e2b0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
2e2c0 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e  .    fd = osOpen
2e2d0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2e2e0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2e2f0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2e300 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2e310 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2e320 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
2e330 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
2e340 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
2e350 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
2e360 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
2e370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e380 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 70     fd = osOpen(p
2e390 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2e3a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2e3b0 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2e3c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e3d0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
2e3e0 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
2e3f0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
2e400 66 64 20 3d 20 6f 73 4f 70 65 6e 28 70 61 74 68  fd = osOpen(path
2e410 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
2e420 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2e430 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2e440 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
2e450 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
2e460 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
2e470 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
2e480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2e490 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
2e4a0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
2e4b0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
2e4c0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
2e4d0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
2e4e0 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
2e4f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
2e510 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
2e520 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
2e530 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
2e540 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
2e550 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
2e560 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2e570 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
2e580 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
2e590 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
2e5a0 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
2e5b0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
2e5c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2e5d0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
2e5e0 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
2e5f0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
2e600 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
2e610 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
2e620 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
2e630 6e 46 6c 61 67 73 3b 0a 20 20 64 75 6d 6d 79 56  nFlags;.  dummyV
2e640 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
2e650 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
2e660 46 69 6e 64 65 72 3b 0a 20 20 70 55 6e 75 73 65  Finder;.  pUnuse
2e670 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
2e680 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
2e690 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
2e6a0 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2e6b0 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
2e6c0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
2e6d0 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72  ummyVfs, fd, dir
2e6e0 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  fd, (sqlite3_fil
2e6f0 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30  e*)pNew, path, 0
2e700 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2e710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e720 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b   *ppFile = pNew;
2e730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e740 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63  TE_OK;.  }.end_c
2e750 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20  reate_proxy:    
2e760 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
2e770 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  pNew, fd, __LINE
2e780 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  __);.  sqlite3_f
2e790 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c  ree(pNew);.  sql
2e7a0 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65  ite3_free(pUnuse
2e7b0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
2e7c0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2e7d0 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61  E_TEST./* simula
2e7e0 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
2e7f0 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
2e800 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
2e810 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71   paths */.int sq
2e820 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2e830 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64   = 0;.#endif..#d
2e840 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54  efine PROXY_HOST
2e850 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20  IDLEN    16  /* 
2e860 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20  conch file host 
2e870 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a  id length */../*
2e880 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69   Not always defi
2e890 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ned in the heade
2e8a0 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74  rs as it ought t
2e8b0 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69  o be */.extern i
2e8c0 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75  nt gethostuuid(u
2e8d0 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20  uid_t id, const 
2e8e0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2e8f0 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20  *wait);../* get 
2e900 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
2e910 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
2e920 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
2e930 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
2e940 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
2e950 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
2e960 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2e970 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
2e980 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2e990 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
2e9a0 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50  ror){.  assert(P
2e9b0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
2e9c0 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
2e9d0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
2e9e0 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
2e9f0 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65  STIDLEN);.#if de
2ea00 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58  fined(__MAX_OS_X
2ea10 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
2ea20 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20  UIRED)\.        
2ea30 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f         && __MAC_
2ea40 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
2ea50 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20  _REQUIRED<1050. 
2ea60 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
2ea70 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
2ea80 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31  pec timeout = {1
2ea90 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74  , 0}; /* 1 sec t
2eaa0 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66  imeout */.    if
2eab0 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48  ( gethostuuid(pH
2eac0 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29  ostID, &timeout)
2ead0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
2eae0 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
2eaf0 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
2eb00 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d         *pError =
2eb10 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20   err;.      }.  
2eb20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2eb30 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
2eb40 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
2eb50 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
2eb60 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
2eb70 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
2eb80 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
2eb90 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
2eba0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2ebb0 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
2ebc0 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
2ebd0 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
2ebe0 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
2ebf0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2ec00 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
2ec10 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
2ec20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ec30 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
2ec40 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
2ec50 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
2ec60 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
2ec70 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
2ec80 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
2ec90 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
2eca0 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
2ecb0 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
2ecc0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
2ecd0 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
2ece0 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
2ecf0 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
2ed00 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
2ed10 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
2ed20 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
2ed30 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
2ed40 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
2ed50 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
2ed60 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
2ed70 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
2ed80 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
2ed90 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
2eda0 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
2edb0 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
2edc0 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
2edd0 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
2ede0 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
2edf0 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
2ee00 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2ee10 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
2ee20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
2ee30 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
2ee40 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
2ee50 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
2ee60 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
2ee70 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
2ee80 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
2ee90 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2eea0 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
2eeb0 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
2eec0 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
2eed0 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
2eee0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2eef0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2ef00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2ef10 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2ef20 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
2ef30 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
2ef40 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
2ef50 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
2ef60 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
2ef70 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
2ef80 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
2ef90 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
2efa0 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
2efb0 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
2efc0 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
2efd0 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
2efe0 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
2eff0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2f000 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20   int rc = -1;.  
2f010 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2f020 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f  (myHostID);..  /
2f030 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  * create a new p
2f040 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74  ath by replace t
2f050 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f  he trailing '-co
2f060 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61  nch' with '-brea
2f070 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20  k' */.  pathLen 
2f080 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c  = strlcpy(tPath,
2f090 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c   cPath, MAXPATHL
2f0a0 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c  EN);.  if( pathL
2f0b0 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c  en>MAXPATHLEN ||
2f0c0 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20   pathLen<6 || . 
2f0d0 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50      (strlcpy(&tP
2f0e0 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20  ath[pathLen-5], 
2f0f0 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35  "break", 6) != 5
2f100 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2f110 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2f120 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
2f130 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
2f140 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c   %d)",(int)pathL
2f150 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
2f160 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2f170 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
2f180 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
2f190 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72    readLen = osPr
2f1a0 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
2f1b0 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  , buf, PROXY_MAX
2f1c0 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
2f1d0 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58  if( readLen<PROX
2f1e0 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20  Y_PATHINDEX ){. 
2f1f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2f200 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
2f210 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20  g),errmsg,"read 
2f220 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
2f230 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20  (int)readLen);. 
2f240 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
2f250 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
2f260 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
2f270 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72  the temporary br
2f280 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64  eak file */.  fd
2f290 20 3d 20 6f 73 4f 70 65 6e 28 74 50 61 74 68 2c   = osOpen(tPath,
2f2a0 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
2f2b0 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c 49 54 45  |O_EXCL), SQLITE
2f2c0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2f2d0 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
2f2e0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
2f2f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2f300 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
2f310 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
2f320 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
2f330 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
2f340 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2f350 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28  .  if( osPwrite(
2f360 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e  fd, buf, readLen
2f370 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74  , 0) != (ssize_t
2f380 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20  )readLen ){.    
2f390 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f3a0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
2f3b0 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20   errmsg, "write 
2f3c0 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
2f3d0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
2f3e0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2f3f0 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74  }.  if( rename(t
2f400 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a  Path, cPath) ){.
2f410 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2f420 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
2f430 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65  sg), errmsg, "re
2f440 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
2f450 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
2f460 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
2f470 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
2f480 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
2f490 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
2f4a0 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
2f4b0 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f  Path);.  robust_
2f4c0 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e  close(pFile, con
2f4d0 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e  chFile->h, __LIN
2f4e0 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  E__);.  conchFil
2f4f0 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e  e->h = fd;.  con
2f500 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
2f510 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2f520 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b  REAT;..end_break
2f530 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29  lock:.  if( rc )
2f540 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  {.    if( fd>=0 
2f550 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28  ){.      unlink(
2f560 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f  tPath);.      ro
2f570 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
2f580 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2f590 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
2f5a0 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
2f5b0 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
2f5c0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
2f5d0 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
2f5e0 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
2f5f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
2f600 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2f610 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2f620 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
2f630 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
2f640 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
2f650 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
2f660 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
2f670 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
2f680 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
2f690 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
2f6a0 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
2f6b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2f6c0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2f6d0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
2f6e0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2f6f0 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
2f700 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
2f710 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
2f720 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f730 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20  K;.  int nTries 
2f740 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69  = 0;.  struct ti
2f750 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54  mespec conchModT
2f760 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20  ime;.  .  do {. 
2f770 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2f780 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
2f790 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2f7a0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
2f7b0 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65  Type);.    nTrie
2f7c0 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63  s ++;.    if( rc
2f7d0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
2f7e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2f7f0 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75   lock failed (bu
2f800 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73  sy):.       * 1s
2f810 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d  t try: get the m
2f820 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63  od time of the c
2f830 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20  onch, wait 0.5s 
2f840 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a  and try again. .
2f850 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79         * 2nd try
2f860 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f  : fail if the mo
2f870 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f  d time changed o
2f880 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69 66  r host id is dif
2f890 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20  ferent, wait .  
2f8a0 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
2f8b0 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
2f8c0 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33  again.       * 3
2f8d0 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68  rd try: break th
2f8e0 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68  e lock unless th
2f8f0 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63  e mod time has c
2f900 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a  hanged..       *
2f910 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
2f920 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69  tat buf;.      i
2f930 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68  f( osFstat(conch
2f940 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
2f950 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
2f960 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2f970 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
2f980 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2f990 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
2f9a0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
2f9b0 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20  Tries==1 ){.    
2f9c0 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
2f9d0 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73   = buf.st_mtimes
2f9e0 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c  pec;.        usl
2f9f0 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20  eep(500000); /* 
2fa00 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64  wait 0.5 sec and
2fa10 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
2fa20 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ain*/.        co
2fa30 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
2fa40 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
2fa50 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20   nTries>1 );.   
2fa60 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54     if( conchModT
2fa70 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75  ime.tv_sec != bu
2fa80 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
2fa90 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20  v_sec || .      
2faa0 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e     conchModTime.
2fab0 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73  tv_nsec != buf.s
2fac0 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e  t_mtimespec.tv_n
2fad0 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sec ){.        r
2fae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2faf0 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
2fb00 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
2fb10 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20  es==2 ){  .     
2fb20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f     char tBuf[PRO
2fb30 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
2fb40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
2fb50 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68   = osPread(conch
2fb60 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50  File->h, tBuf, P
2fb70 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
2fb80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2fb90 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
2fba0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2fbb0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
2fbc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2fbd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
2fbe0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
2fbf0 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f       if( len>PRO
2fc00 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20  XY_PATHINDEX && 
2fc10 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50  tBuf[0]==(char)P
2fc20 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
2fc30 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  N){.          /*
2fc40 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
2fc50 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73   lock if the hos
2fc60 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74  t id doesn't mat
2fc70 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
2fc80 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74  if( 0!=memcmp(&t
2fc90 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
2fca0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
2fcb0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2fcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fcd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2fce0 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SY;.          }.
2fcf0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fd00 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27           /* don'
2fd10 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  t break the lock
2fd20 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f   on short read o
2fd30 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d  r a version mism
2fd40 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
2fd50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fd60 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BUSY;.        }.
2fd70 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
2fd80 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  0000000); /* wai
2fd90 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79  t 10 sec and try
2fda0 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20   the lock again 
2fdb0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
2fdc0 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  nue; .      }.  
2fdd0 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72      .      asser
2fde0 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a  t( nTries==3 );.
2fdf0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f        if( 0==pro
2fe00 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
2fe10 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
2fe20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
2fe30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2fe40 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70       if( lockTyp
2fe50 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
2fe60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2fe70 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
2fe80 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
2fe90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
2fea0 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
2feb0 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a  OCK);          .
2fec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fed0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2fee0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
2fef0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2ff00 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
2ff10 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2ff20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20  lockType);.     
2ff30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ff40 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63   }.  } while( rc
2ff50 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
2ff60 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a   nTries<3 );.  .
2ff70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ff80 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e  /* Takes the con
2ff90 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73  ch by taking a s
2ffa0 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72  hared lock and r
2ffb0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
2ffc0 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c   conch, if .** l
2ffd0 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e  ockPath is non-N
2ffe0 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44  ULL, the host ID
2fff0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
30000 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  ath must match. 
30010 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b   A NULL .** lock
30020 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20  Path means that 
30030 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20  the lockPath in 
30040 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
30050 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74  ill be used if t
30060 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20  he .** host IDs 
30070 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20  match, or a new 
30080 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
30090 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f  e generated auto
300a0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e  matically .** an
300b0 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
300c0 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a   conch file..*/.
300d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
300e0 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  TakeConch(unixFi
300f0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72  le *pFile){.  pr
30100 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
30110 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
30120 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
30130 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
30140 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66  ontext; .  .  if
30150 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
30160 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d!=0 ){.    retu
30170 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30180 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
30190 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
301a0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
301b0 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48  ;.    uuid_t myH
301c0 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70  ostID;.    int p
301d0 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63  Error = 0;.    c
301e0 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58  har readBuf[PROX
301f0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
30200 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74      char lockPat
30210 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
30220 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63     char *tempLoc
30230 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  kPath = NULL;.  
30240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30250 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72  E_OK;.    int cr
30260 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20  eateConch = 0;. 
30270 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74     int hostIdMat
30280 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
30290 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20  readLen = 0;.   
302a0 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50   int tryOldLockP
302b0 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ath = 0;.    int
302c0 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74   forceNewLockPat
302d0 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  h = 0;.    .    
302e0 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f  OSTRACE(("TAKECO
302f0 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
30300 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
30310 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
30320 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
30330 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
30340 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
30350 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74  : ":auto:"), get
30360 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63  pid()));..    rc
30370 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49   = proxyGetHostI
30380 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72  D(myHostID, &pEr
30390 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ror);.    if( (r
303a0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
303b0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70  IOERR ){.      p
303c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
303d0 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
303e0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
303f0 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ch;.    }.    rc
30400 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
30410 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
30420 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  D, SHARED_LOCK);
30430 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30450 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
30460 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ch;.    }.    /*
30470 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69   read the existi
30480 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  ng conch file */
30490 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73  .    readLen = s
304a0 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78  eekAndRead((unix
304b0 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  File*)conchFile,
304c0 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f   0, readBuf, PRO
304d0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b  XY_MAXCONCHLEN);
304e0 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e  .    if( readLen
304f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  <0 ){.      /* I
30500 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72  /O error: lastEr
30510 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
30520 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20  ndRead */.      
30530 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
30540 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61   = conchFile->la
30550 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
30560 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
30570 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74  _READ;.      got
30580 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
30590 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
305a0 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48  eadLen<=(PROXY_H
305b0 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
305c0 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20  OSTIDLEN) || .  
305d0 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42             readB
305e0 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f  uf[0]!=(char)PRO
305f0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
30600 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68  ){.      /* a sh
30610 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73  ort read or vers
30620 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61  ion format misma
30630 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65  tch means we nee
30640 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
30650 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63  w .      ** conc
30660 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a  h file. .      *
30670 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f  /.      createCo
30680 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nch = 1;.    }. 
30690 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73     /* if the hos
306a0 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64  t id matches and
306b0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61   the lock path a
306c0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
306d0 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a   the conch.    *
306e0 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75  * we'll try to u
306f0 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72  se the path ther
30700 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f  e, if we can't o
30710 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77  pen that path, w
30720 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74  e'll .    ** ret
30730 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75  ry with a new au
30740 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74  to-generated pat
30750 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  h .    */.    do
30760 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65   { /* in case we
30770 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61   need to try aga
30780 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a  in for an :auto:
30790 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65   named lock file
307a0 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
307b0 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21  createConch && !
307c0 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
307d0 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74   ){.        host
307e0 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d  IdMatch = !memcm
307f0 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  p(&readBuf[PROXY
30800 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
30810 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20  ostID, .        
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30830 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f            PROXY_
30840 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
30850 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f      /* if the co
30860 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d  nch has data com
30870 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
30880 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
30890 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
308a0 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
308b0 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e     /* for auto-n
308c0 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  amed local lock 
308d0 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b  file, just check
308e0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
308f0 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20   we'll.         
30900 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63    ** use the loc
30910 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
30920 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79  h that's already
30930 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20   in there.      
30940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30950 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63    if( hostIdMatc
30960 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
30970 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
30980 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f  = (readLen - PRO
30990 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20  XY_PATHINDEX);. 
309a0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
309b0 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68          if( path
309c0 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20  Len>=MAXPATHLEN 
309d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
309e0 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48   pathLen=MAXPATH
309f0 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  LEN-1;.         
30a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30a10 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68   memcpy(lockPath
30a20 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
30a30 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74  _PATHINDEX], pat
30a40 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  hLen);.         
30a50 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68     lockPath[path
30a60 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Len] = 0;.      
30a70 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61        tempLockPa
30a80 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20  th = lockPath;. 
30a90 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c             tryOl
30aa0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  dLockPath = 1;. 
30ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72             /* cr
30ac0 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
30ad0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20  he lock path if 
30ae0 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b  the conch is tak
30af0 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
30b00 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
30b10 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20  onch;.          
30b20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
30b30 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a  if( hostIdMatch.
30b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
30b50 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d  & !strncmp(pCtx-
30b60 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
30b70 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50  &readBuf[PROXY_P
30b80 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20  ATHINDEX],.     
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ba0 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52        readLen-PR
30bb0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20  OXY_PATHINDEX). 
30bc0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
30bd0 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73      /* conch hos
30be0 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20  t and lock path 
30bf0 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
30c00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
30c10 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20  conch; .        
30c20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30c30 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65  .      /* if the
30c40 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69   conch isn't wri
30c50 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27  table and doesn'
30c60 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27  t match, we can'
30c70 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20  t take it */.   
30c80 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c     if( (conchFil
30c90 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
30ca0 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  DWR) == 0 ){.   
30cb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30cc0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67  _BUSY;.        g
30cd0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
30ce0 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
30cf0 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65   .      /* eithe
30d00 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e  r the conch didn
30d10 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e  't match or we n
30d20 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
30d30 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  new one */.     
30d40 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
30d50 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
30d60 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63       proxyGetLoc
30d70 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61  kPath(pCtx->dbPa
30d80 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41  th, lockPath, MA
30d90 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
30da0 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
30db0 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
30dc0 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
30dd0 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
30de0 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20   path _only_ if 
30df0 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b  the conch is tak
30e00 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  en */.      }.  
30e10 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70      .      /* up
30e20 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20  date conch with 
30e30 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74  host and path (t
30e40 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66  his will fail if
30e50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
30e60 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68       ** has a sh
30e70 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64  ared lock alread
30e80 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20  y), if the host 
30e90 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20  id matches, use 
30ea0 74 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a  the big.      **
30eb0 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stick..      */
30ec0 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63  .      futimes(c
30ed0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c  onchFile->h, NUL
30ee0 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f  L);.      if( ho
30ef0 73 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72  stIdMatch && !cr
30f00 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20  eateConch ){.   
30f10 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69       if( conchFi
30f20 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f  le->pInode && co
30f30 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  nchFile->pInode-
30f40 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
30f50 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
30f60 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
30f70 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
30f80 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
30f90 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  d in this.      
30fa0 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
30fb0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
30fc0 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
30fd0 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ock. */.        
30fe0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
30ff0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  SY;.        } el
31000 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20  se {          . 
31010 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
31020 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
31030 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58  le, myHostID, EX
31040 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
31050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
31070 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
31080 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
31090 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
310a0 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
310b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
310c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
310d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
310e0 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66     char writeBuf
310f0 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  fer[PROXY_MAXCON
31100 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
31110 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20  int writeSize = 
31120 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  0;.        .    
31130 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b      writeBuffer[
31140 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59  0] = (char)PROXY
31150 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20  _CONCHVERSION;. 
31160 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77         memcpy(&w
31170 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
31180 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
31190 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
311a0 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
311b0 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
311c0 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29  roxyPath!=NULL )
311d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  {.          strl
311e0 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
311f0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
31200 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ], pCtx->lockPro
31210 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
31220 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  EN);.        }el
31230 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
31240 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
31250 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
31260 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  EX], tempLockPat
31270 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
31280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31290 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52    writeSize = PR
312a0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20  OXY_PATHINDEX + 
312b0 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66  strlen(&writeBuf
312c0 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
312d0 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  DEX]);.        r
312e0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
312f0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72  conchFile->h, wr
31300 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  iteSize);.      
31310 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65    rc = unixWrite
31320 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
31330 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74  )conchFile, writ
31340 65 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69  eBuffer, writeSi
31350 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
31360 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d  fsync(conchFile-
31370 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  >h);.        /* 
31380 49 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20  If we created a 
31390 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28  new conch file (
313a0 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64  not just updated
313b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
313c0 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20   a .         ** 
313d0 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65  valid conch file
313e0 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ), try to match 
313f0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
31400 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31410 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
31420 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31430 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65  ITE_OK && create
31440 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Conch ){.       
31450 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
31460 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  uf;.          in
31470 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61 74 28  t err = osFstat(
31480 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
31490 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
314a0 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
314b0 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64       mode_t cmod
314c0 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26  e = buf.st_mode&
314d0 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52  (S_IRUSR|S_IWUSR
314e0 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47   | S_IRGRP|S_IWG
314f0 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  RP |.           
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31510 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49               S_I
31520 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20  ROTH|S_IWOTH);. 
31530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
31540 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64  y to match the d
31550 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57  atabase file R/W
31560 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67   permissions, ig
31570 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a  nore failure */.
31580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50  #ifndef SQLITE_P
31590 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20  ROXY_DEBUG.     
315a0 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
315b0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d  conchFile->h, cm
315c0 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ode);.#else.    
315d0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
315e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6f            rc = o
315f0 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c  sFchmod(conchFil
31600 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20  e->h, cmode);.  
31610 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
31620 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20 65 72  ( rc==(-1) && er
31630 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
31640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31650 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
31660 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
31670 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
31680 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
31690 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
316a0 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25  FAILED with %d %
316b0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
316c0 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64              cmod
316d0 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  e, code, strerro
316e0 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  r(code));.      
316f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
31710 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
31720 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44  hmod %o SUCCEDED
31730 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20  \n",cmode);.    
31740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31760 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
31770 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
31780 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
31790 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45  err, "STAT FAILE
317a0 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 73  D[%d] with %d %s
317b0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
317c0 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63            err, c
317d0 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
317e0 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  de));.#endif.   
317f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31800 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31810 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
31820 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
31830 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
31840 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
31850 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  CK);.      .    
31860 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20  end_takeconch:. 
31870 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
31880 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45  RANSPROXY: CLOSE
31890 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e    %d\n", pFile->
318a0 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  h));.      if( r
318b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
318c0 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
318d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
318e0 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
318f0 20 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f           robust_
31900 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
31910 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
31920 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31930 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
31940 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  1;.        int f
31950 64 20 3d 20 6f 73 4f 70 65 6e 28 70 43 74 78 2d  d = osOpen(pCtx-
31960 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  >dbPath, pFile->
31970 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20  openFlags,.     
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31990 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
319a0 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
319b0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
319c0 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE(("TRANSPROXY:
319d0 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64   OPEN  %d\n", fd
319e0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
319f0 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fd>=0 ){.       
31a00 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64     pFile->h = fd
31a10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
31a20 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53 51  .          rc=SQ
31a30 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
31a40 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55  PT; /* SQLITE_BU
31a50 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  SY? proxyTakeCon
31a60 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20  ch called.      
31a70 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b       during lock
31a80 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ing */.        }
31a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31ab0 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50   && !pCtx->lockP
31ac0 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20  roxy ){.        
31ad0 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d  char *path = tem
31ae0 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70  pLockPath ? temp
31af0 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d  LockPath : pCtx-
31b00 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
31b10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
31b20 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
31b30 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f  (path, &pCtx->lo
31b40 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20  ckProxy, 1);.   
31b50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31b60 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
31b70 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72  LITE_NOMEM && tr
31b80 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  yOldLockPath ){.
31b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20            /* we 
31ba0 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20  couldn't create 
31bb0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
31bc0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64  ile with the old
31bd0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a   lock file path.
31be0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
31bf0 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20 61   try again via a
31c00 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20  uto-naming .    
31c10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31c20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b      forceNewLock
31c30 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
31c40 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
31c50 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  th = 0;.        
31c60 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67    continue; /* g
31c70 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f  o back to the do
31c80 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20   {} while start 
31c90 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e  point, try again
31ca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
31cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31cd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
31ce0 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20   to make a copy 
31cf0 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65 78  of path if we ex
31d00 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c 75  tracted the valu
31d10 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  e.         ** fr
31d20 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  om the conch fil
31d30 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77 61  e or the path wa
31d40 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  s allocated on t
31d50 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20  he stack.       
31d60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
31d70 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b   tempLockPath ){
31d80 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
31d90 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
31da0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
31db0 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  (0, tempLockPath
31dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31dd0 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
31de0 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
31df0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31e00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
31e10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31e20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31e40 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
31e50 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20  onchHeld = 1;.  
31e60 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69        .        i
31e70 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
31e80 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  xy->pMethod == &
31e90 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
31ea0 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63            afpLoc
31eb0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70  kingContext *afp
31ec0 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Ctx;.          a
31ed0 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b  fpCtx = (afpLock
31ee0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74  ingContext *)pCt
31ef0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f  x->lockProxy->lo
31f00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
31f10 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e          afpCtx->
31f20 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c  dbPath = pCtx->l
31f30 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
31f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
31f50 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63  else {.        c
31f60 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31f70 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
31f80 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31f90 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
31fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
31fb0 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48  RACE(("TAKECONCH
31fc0 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
31fd0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
31fe0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
31ff0 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69  ITE_OK?"ok":"fai
32000 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65  led"));.      re
32010 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77  turn rc;.    } w
32020 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20  hile (1); /* in 
32030 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
32040 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a  retry the :auto:
32050 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20   lock file - .  
32060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
32070 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * we should neve
32080 72 20 67 65 74 20 68 65 72 65 20 65 78 63 65 70  r get here excep
32090 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69  t via the 'conti
320a0 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20  nue' call. */.  
320b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46  }.}../*.** If pF
320c0 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b  ile holds a lock
320d0 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   on a conch file
320e0 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74  , then release t
320f0 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  hat lock..*/.sta
32100 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c  tic int proxyRel
32110 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  easeConch(unixFi
32120 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
32130 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32140 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62  ;         /* Sub
32150 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63  routine return c
32160 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  ode */.  proxyLo
32170 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
32180 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  tx;  /* The lock
32190 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
321a0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a  the proxy lock *
321b0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  /.  unixFile *co
321c0 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
321d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
321e0 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  onch file */..  
321f0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
32200 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
32210 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
32220 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65  ext;.  conchFile
32230 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
32240 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  le;.  OSTRACE(("
32250 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
32260 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
32270 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
32280 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74  .           (pCt
32290 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
322a0 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
322b0 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
322c0 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
322d0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66  getpid()));.  if
322e0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
322f0 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  d>0 ){.    rc = 
32300 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
32310 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
32320 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
32330 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
32340 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63    }.  pCtx->conc
32350 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54  hHeld = 0;.  OST
32360 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
32370 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63  NCH  %d %s\n", c
32380 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
32390 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c          (rc==SQL
323a0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
323b0 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72  "failed")));.  r
323c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
323d0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
323e0 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
323f0 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68  file, compute th
32400 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f  e name of its co
32410 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f  nch file..** Sto
32420 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  re the conch fil
32430 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20  ename in memory 
32440 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
32450 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
32460 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50  ** Make *pConchP
32470 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ath point to the
32480 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75   new name.  Retu
32490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
324a0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51  success.** or SQ
324b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e  LITE_NOMEM if un
324c0 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d  able to obtain m
324d0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
324e0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
324f0 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
32500 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ing that the all
32510 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
32520 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74 75   space is eventu
32530 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
32540 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73  * *pConchPath is
32550 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
32560 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
32570 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
32580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32590 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68  proxyCreateConch
325a0 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64  Pathname(char *d
325b0 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43  bPath, char **pC
325c0 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74  onchPath){.  int
325d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
325e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
325f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
32600 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  int len = (int)s
32610 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f  trlen(dbPath); /
32620 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61  * Length of data
32630 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20  base filename - 
32640 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72  dbPath */.  char
32650 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20   *conchPath;    
32660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66            /* buf
32670 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
32680 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20  construct conch 
32690 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  name */..  /* Al
326a0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
326b0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
326c0 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ame and initiali
326d0 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20  ze the name to. 
326e0 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   ** the name of 
326f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
32700 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20  abase file. */  
32710 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d  .  *pConchPath =
32720 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68   conchPath = (ch
32730 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
32740 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20  loc(len + 8);.  
32750 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30  if( conchPath==0
32760 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
32770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
32780 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50  .  memcpy(conchP
32790 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e  ath, dbPath, len
327a0 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77  +1);.  .  /* now
327b0 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65   insert a "." be
327c0 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20  fore the last / 
327d0 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66  character */.  f
327e0 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69  or( i=(len-1); i
327f0 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20  >=0; i-- ){.    
32800 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  if( conchPath[i]
32810 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
32820 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
32830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e  .    }.  }.  con
32840 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20  chPath[i]='.';. 
32850 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29   while ( i<len )
32860 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b  {.    conchPath[
32870 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a  i+1]=dbPath[i];.
32880 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
32890 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d  /* append the "-
328a0 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f  conch" suffix to
328b0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d   the file */.  m
328c0 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68  emcpy(&conchPath
328d0 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c  [i+1], "-conch",
328e0 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28   7);.  assert( (
328f0 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68  int)strlen(conch
32900 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29  Path) == len+7 )
32910 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
32920 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61  TE_OK;.}.../* Ta
32930 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66  kes a fully conf
32940 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63  igured proxy loc
32950 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20  king-style unix 
32960 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65  file and switche
32970 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c  s.** the local l
32980 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a  ock file path .*
32990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77 69  /.static int swi
329a0 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68  tchLockProxyPath
329b0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
329c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
329d0 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
329e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
329f0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
32a00 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
32a10 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
32a20 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68  .  char *oldPath
32a30 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
32a40 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63  xyPath;.  int rc
32a50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
32a60 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
32a70 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock!=NO_LOCK )
32a80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32a90 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a  ITE_BUSY;.  }  .
32aa0 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  .  /* nothing to
32ab0 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68 20   do if the path 
32ac0 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20  is NULL, :auto: 
32ad0 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20 65  or matches the e
32ae0 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a  xisting path */.
32af0 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70    if( !path || p
32b00 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20  ath[0]=='\0' || 
32b10 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a  !strcmp(path, ":
32b20 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28  auto:") ||.    (
32b30 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72 6e  oldPath && !strn
32b40 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74  cmp(oldPath, pat
32b50 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20  h, MAXPATHLEN)) 
32b60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32b70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
32b80 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
32b90 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78  lockProxy = pCtx
32ba0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
32bb0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
32bc0 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d  =NULL;.    pCtx-
32bd0 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
32be0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
32bf0 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  y!=NULL ){.     
32c00 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70   rc=lockProxy->p
32c10 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
32c20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c  sqlite3_file *)l
32c30 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
32c40 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
32c50 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
32c60 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
32c70 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  y);.    }.    sq
32c80 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61  lite3_free(oldPa
32c90 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  th);.    pCtx->l
32ca0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
32cb0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
32cc0 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a  , path);.  }.  .
32cd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32ce0 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61  /*.** pFile is a
32cf0 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62   file that has b
32d00 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20  een opened by a 
32d10 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c  prior xOpen call
32d20 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20  .  dbPath.** is 
32d30 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
32d40 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48  at least MAXPATH
32d50 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73  LEN+1 characters
32d60 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
32d70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e  This routine fin
32d80 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  d the filename a
32d90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
32da0 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20  File and writes 
32db0 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68  it.** int dbPath
32dc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32dd0 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f  proxyGetDbPathFo
32de0 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  rUnixFile(unixFi
32df0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20  le *pFile, char 
32e00 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65  *dbPath){.#if de
32e10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
32e20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
32e30 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d  ethod == &afpIoM
32e40 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
32e50 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73   afp style keeps
32e60 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
32e70 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20 74  the db path in t
32e80 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c  he filePath fiel
32e90 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
32ea0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61   struct */.    a
32eb0 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c  ssert( (int)strl
32ec0 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
32ed0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
32ee0 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
32ef0 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
32f00 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67  th, ((afpLocking
32f10 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
32f20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
32f30 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54  ->dbPath, MAXPAT
32f40 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a  HLEN);.  } else.
32f50 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69  #endif.  if( pFi
32f60 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
32f70 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
32f80 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c   ){.    /* dot l
32f90 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74  ock style uses t
32fa0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
32fb0 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
32fc0 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  dot lock.    ** 
32fd0 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
32fe0 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
32ff0 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  n((char *)pFile-
33000 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
33010 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43   - strlen(DOTLOC
33020 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d  K_SUFFIX);.    m
33030 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28 63  emcpy(dbPath, (c
33040 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
33050 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e  kingContext, len
33060 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   + 1);.  }else{.
33070 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72      /* all other
33080 20 73 74 79 6c 65 73 20 75 73 65 20 74 68 65 20   styles use the 
33090 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
330a0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62 20  to store the db 
330b0 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
330c0 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
330d0 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f  (char*)pFile->lo
330e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d  ckingContext)<=M
330f0 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20  AXPATHLEN );.   
33100 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c   strlcpy(dbPath,
33110 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
33120 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
33130 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d  MAXPATHLEN);.  }
33140 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33150 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61  _OK;.}../*.** Ta
33160 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66  kes an already f
33170 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69  illed in unix fi
33180 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74  le and alters it
33190 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63   so all file loc
331a0 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65  king .** will be
331b0 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
331c0 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f  e local proxy lo
331d0 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f  ck file.  The fo
331e0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a  llowing fields.*
331f0 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20  * are preserved 
33200 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
33210 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74  ontext so that t
33220 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
33230 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  red and .** the 
33240 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70  unix structure p
33250 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20  roperly cleaned 
33260 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65  up at close time
33270 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43  :.**  ->lockingC
33280 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65  ontext.**  ->pMe
33290 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69  thod.*/.static i
332a0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
332b0 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
332c0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
332d0 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
332e0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
332f0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68  text *pCtx;.  ch
33300 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54  ar dbPath[MAXPAT
33310 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f  HLEN+1];       /
33320 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
33330 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
33340 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d   char *lockPath=
33350 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  NULL;.  int rc =
33360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
33370 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
33380 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock!=NO_LOCK )
33390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
333a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
333b0 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f  proxyGetDbPathFo
333c0 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  rUnixFile(pFile,
333d0 20 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20   dbPath);.  if( 
333e0 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
333f0 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
33400 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
33410 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74  ) ){.    lockPat
33420 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  h=NULL;.  }else{
33430 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63  .    lockPath=(c
33440 68 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a  har *)path;.  }.
33450 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54    .  OSTRACE(("T
33460 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f  RANSPROXY  %d fo
33470 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
33480 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
33490 20 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f       (lockPath ?
334a0 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75   lockPath : ":au
334b0 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29  to:"), getpid())
334c0 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c  );..  pCtx = sql
334d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
334e0 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
334f0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
33500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33510 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
33520 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69  mset(pCtx, 0, si
33530 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20  zeof(*pCtx));.. 
33540 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
33550 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64  eConchPathname(d
33560 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f  bPath, &pCtx->co
33570 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20  nchFilePath);.  
33580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33590 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
335a0 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
335b0 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
335c0 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f  ePath, &pCtx->co
335d0 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  nchFile, 0);.   
335e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
335f0 43 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46  CANTOPEN && ((pF
33600 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
33610 5f 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a  _RDWR) == 0) ){.
33620 20 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20        /* if (a) 
33630 74 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61  the open flags a
33640 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28  re not O_RDWR, (
33650 62 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  b) the conch isn
33660 27 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20  't there, and.  
33670 20 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66      ** (c) the f
33680 69 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72 65  ile system is re
33690 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e  ad-only, then en
336a0 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20  able no-locking 
336b0 61 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a  access..      **
336c0 20 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44   Ugh, since O_RD
336d0 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20  ONLY==0x0000 we 
336e0 74 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52  test for !O_RDWR
336f0 20 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20   since unixOpen 
33700 61 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a  asserts.      **
33710 20 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20   that openFlags 
33720 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f  will have only o
33730 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f  ne of O_RDONLY o
33740 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20  r O_RDWR..      
33750 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
33760 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
33770 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
33780 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20   conchInfo;.    
33790 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73    int goLockless
337a0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
337b0 20 6f 73 53 74 61 74 28 70 43 74 78 2d 3e 63 6f   osStat(pCtx->co
337c0 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f  nchFilePath, &co
337d0 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  nchInfo) == -1 )
337e0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65   {.        int e
337f0 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
33800 20 20 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e      if( (err==EN
33810 4f 45 4e 54 29 20 26 26 20 28 73 74 61 74 66 73  OENT) && (statfs
33820 28 64 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  (dbPath, &fsInfo
33830 29 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20  ) != -1) ){.    
33840 20 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73        goLockless
33850 20 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61   = (fsInfo.f_fla
33860 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d  gs&MNT_RDONLY) =
33870 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20  = MNT_RDONLY;.  
33880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33890 20 20 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b        if( goLock
338a0 6c 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  less ){.        
338b0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
338c0 3d 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e  = -1; /* read on
338d0 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20  ly FS/ lockless 
338e0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
338f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
33900 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20   }.    }.  }  . 
33910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33920 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29  OK && lockPath )
33930 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  {.    pCtx->lock
33940 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
33950 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c  te3DbStrDup(0, l
33960 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ockPath);.  }.. 
33970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33980 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  OK ){.    pCtx->
33990 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  dbPath = sqlite3
339a0 44 62 53 74 72 44 75 70 28 30 2c 20 64 62 50 61  DbStrDup(0, dbPa
339b0 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  th);.    if( pCt
339c0 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20  x->dbPath==NULL 
339d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
339e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
339f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
33a00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33a10 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69   /* all memory i
33a20 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f  s allocated, pro
33a30 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20  xys are created 
33a40 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20  and assigned, . 
33a50 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65     ** switch the
33a60 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
33a70 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65   and pMethod the
33a80 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f  n return..    */
33a90 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f  .    pCtx->oldLo
33aa0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
33ab0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
33ac0 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
33ad0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
33ae0 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78  = pCtx;.    pCtx
33af0 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70  ->pOldMethod = p
33b00 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20  File->pMethod;. 
33b10 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
33b20 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68  d = &proxyIoMeth
33b30 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
33b40 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
33b50 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20  hFile ){ .      
33b60 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d  pCtx->conchFile-
33b70 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
33b80 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
33b90 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  )pCtx->conchFile
33ba0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33bb0 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
33bc0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
33bd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
33be0 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  0, pCtx->lockPro
33bf0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
33c00 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
33c10 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20  conchFilePath); 
33c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33c30 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f  e(pCtx);.  }.  O
33c40 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
33c50 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70  OXY  %d %s\n", p
33c60 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
33c70 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
33c80 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
33c90 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72  led")));.  retur
33ca0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
33cb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e  This routine han
33cc0 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c  dles sqlite3_fil
33cd0 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c  e_control() call
33ce0 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
33cf0 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20  fic.** to proxy 
33d00 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
33d10 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
33d20 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
33d30 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
33d40 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
33d50 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
33d60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
33d70 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
33d80 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
33d90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
33da0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
33db0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
33dc0 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
33dd0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
33de0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
33df0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
33e00 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33e10 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
33e20 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
33e30 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63     proxyTakeConc
33e40 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
33e50 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
33e60 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
33e70 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
33e80 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43  har **)pArg = pC
33e90 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33ea0 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  h;.        }else
33eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
33ec0 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
33ed0 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20   = ":auto: (not 
33ee0 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20  held)";.        
33ef0 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
33f00 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74  .        *(const
33f10 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
33f20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
33f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33f40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
33f50 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
33f60 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
33f70 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
33f80 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
33f90 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
33fa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33fb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72  ;.      int isPr
33fc0 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c  oxyStyle = (pFil
33fd0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
33fe0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a  roxyIoMethods);.
33ff0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
34000 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63  NULL || (const c
34010 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b  har *)pArg==0 ){
34020 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
34030 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
34040 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
34050 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
34060 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64   - not supported
34070 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
34080 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   = SQLITE_ERROR 
34090 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  /*SQLITE_PROTOCO
340a0 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  L? SQLITE_MISUSE
340b0 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ?*/;.        }el
340c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
340d0 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
340e0 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64  locking - alread
340f0 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a  y off - NOOP */.
34100 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34110 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
34120 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
34130 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
34140 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d  har *proxyPath =
34150 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
34160 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Arg;.        if(
34170 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
34180 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79  .          proxy
34190 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
341a0 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20  pCtx = .        
341b0 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e      (proxyLockin
341c0 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
341d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
341e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
341f0 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61  strcmp(pArg, ":a
34200 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20  uto:") .        
34210 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63     || (pCtx->loc
34220 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20  kProxyPath &&.  
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74               !st
34240 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
34250 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79  ProxyPath, proxy
34260 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
34270 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
34280 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
34290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
342a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
342b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77           rc = sw
342c0 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
342d0 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  h(pFile, proxyPa
342e0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
342f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
34310 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20  n on proxy file 
34320 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
34330 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
34340 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
34350 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
34360 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h);.        }.  
34370 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
34380 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
34390 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
343a0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
343b0 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75  /* The call assu
343c0 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61  res that only va
343d0 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20  lid opcodes are 
343e0 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  sent */.    }.  
343f0 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
34400 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
34410 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
34420 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64  ** Within this d
34430 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f  ivision (the pro
34440 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d  xying locking im
34450 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68  plementation) th
34460 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20  e procedures.** 
34470 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
34480 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69   are all utiliti
34490 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65  es.  The lock-re
344a0 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66  lated methods of
344b0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f   the.** proxy-lo
344c0 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f  cking sqlite3_io
344d0 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66  _method object f
344e0 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a  ollow..*/.../*.*
344f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
34500 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
34510 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
34520 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
34530 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
34540 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
34550 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
34560 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
34570 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
34580 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
34590 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
345a0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
345b0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
345c0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
345d0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
345e0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
345f0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
34600 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
34610 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
34620 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
34630 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
34640 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
34650 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
34660 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
34670 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
34680 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
34690 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
346a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
346b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
346c0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
346d0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
346e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
346f0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34700 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
34710 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
34720 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
34730 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
34740 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
34750 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
34760 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63  ->pMethod->xChec
34770 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73  kReservedLock((s
34780 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
34790 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20  xy, pResOut);.  
347a0 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63    }else{ /* conc
347b0 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
347c0 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70  kless */.      p
347d0 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a  ResOut=0;.    }.
347e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
347f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
34800 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
34810 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
34820 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
34830 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
34840 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
34850 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
34860 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
34870 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
34880 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
34890 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
348a0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
348b0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
348c0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
348d0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
348e0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
348f0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
34900 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
34910 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
34920 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
34930 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
34940 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
34950 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
34960 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
34970 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
34980 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
34990 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
349a0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
349b0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
349c0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
349d0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
349e0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
349f0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
34a00 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
34a10 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
34a20 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
34a30 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
34a40 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
34a50 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
34a60 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
34a70 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
34a80 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
34a90 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
34aa0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
34ab0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
34ac0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
34ad0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
34ae0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
34af0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
34b00 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
34b10 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
34b20 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
34b30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
34b40 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
34b50 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
34b60 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
34b70 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
34b80 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
34b90 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
34ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34bb0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34bc0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
34bd0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34be0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
34bf0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66  gContext;.    if
34c00 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
34c10 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  d>0 ){.      uni
34c20 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
34c30 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
34c40 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
34c50 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
34c60 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
34c70 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b  proxy, eFileLock
34c80 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
34c90 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78  eFileLock = prox
34ca0 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  y->eFileLock;.  
34cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
34cc0 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20  * conchHeld < 0 
34cd0 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  is lockless */. 
34ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
34cf0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
34d00 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
34d10 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
34d20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
34d30 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
34d40 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
34d50 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
34d60 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
34d70 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
34d80 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
34d90 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
34da0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
34db0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
34dc0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
34dd0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
34de0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
34df0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
34e00 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
34e10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
34e20 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
34e30 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
34e40 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
34e50 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
34e60 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
34e70 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
34e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34e90 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
34ea0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
34eb0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34ec0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
34ed0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
34ee0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
34ef0 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
34f00 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
34f10 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
34f20 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  y;.      rc = pr
34f30 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  oxy->pMethod->xU
34f40 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
34f50 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c  ile*)proxy, eFil
34f60 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46  eLock);.      pF
34f70 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
34f80 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63   proxy->eFileLoc
34f90 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
34fa0 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
34fb0 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
34fc0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
34fd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34fe0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
34ff0 20 74 68 61 74 20 75 73 65 73 20 70 72 6f 78 79   that uses proxy
35000 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69   locks..*/.stati
35010 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
35020 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
35030 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
35040 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
35050 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
35060 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c  *)id;.    proxyL
35070 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
35080 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
35090 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
350a0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
350b0 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
350c0 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
350d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
350e0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
350f0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
35100 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e  onchFile;.    in
35110 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35120 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c  ;.    .    if( l
35130 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
35140 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
35150 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
35160 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
35170 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f  *)lockProxy, NO_
35180 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
35190 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
351a0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
351b0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
351c0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
351d0 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  file*)lockProxy)
351e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
351f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
35200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
35210 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
35220 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
35230 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
35240 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b  if( conchFile ){
35250 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d  .      if( pCtx-
35260 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20  >conchHeld ){.  
35270 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
35280 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69  ReleaseConch(pFi
35290 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
352a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
352b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
352c0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
352d0 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
352e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
352f0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
35300 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
35310 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
35320 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65  3_free(conchFile
35330 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
35340 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43  ite3DbFree(0, pC
35350 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35360 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
35370 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
35380 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73  FilePath);.    s
35390 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
353a0 70 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20  pCtx->dbPath);. 
353b0 20 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68     /* restore th
353c0 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  e original locki
353d0 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70  ng context and p
353e0 4d 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73  Method then clos
353f0 65 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c  e it */.    pFil
35400 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
35410 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63  t = pCtx->oldLoc
35420 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
35430 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
35440 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68  = pCtx->pOldMeth
35450 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  od;.    sqlite3_
35460 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20  free(pCtx);.    
35470 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d  return pFile->pM
35480 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64  ethod->xClose(id
35490 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
354a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
354b0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
354c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
354d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
354e0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
354f0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c  *.** The proxy l
35500 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20  ocking style is 
35510 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65  intended for use
35520 20 77 69 74 68 20 41 46 50 20 66 69 6c 65 73 79   with AFP filesy
35530 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69  stems..** And si
35540 6e 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20  nce AFP is only 
35550 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63  supported on Mac
35560 4f 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c  OSX, the proxy l
35570 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a  ocking is also.*
35580 2a 20 72 65 73 74 72 69 63 74 65 64 20 74 6f 20  * restricted to 
35590 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a  MacOSX..** .**.*
355a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355b0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72  ** End of the pr
355c0 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  oxy lock impleme
355d0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
355e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
355f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
35640 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
35650 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
35660 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
35670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
35680 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61 6c  ine registers al
35690 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  l VFS implementa
356a0 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c  tions for unix-l
356b0 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a  ike operating.**
356c0 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20   systems.  This 
356d0 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65  routine, and the
356e0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
356f0 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66  ) routine that f
35700 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c  ollows,.** shoul
35710 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f  d be the only ro
35720 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
35730 69 6c 65 20 74 68 61 74 20 61 72 65 20 76 69 73  ile that are vis
35740 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a  ible from other.
35750 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** files..**.** 
35760 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
35770 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69  called once duri
35780 6e 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61  ng SQLite initia
35790 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20  lization and by 
357a0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65  a.** single thre
357b0 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  ad.  The memory 
357c0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d  allocation and m
357d0 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
357e0 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65  have not.** nece
357f0 73 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69  ssarily been ini
35800 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
35810 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
35820 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65  lled, and so the
35830 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20  y.** should not 
35840 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20  be used..*/.int 
35850 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
35860 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20  void){ .  /* .  
35870 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
35880 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61   macro defines a
35890 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  n initializer fo
358a0 72 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73  r an sqlite3_vfs
358b0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
358c0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
358d0 53 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20  S is NAME.  The 
358e0 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f  pAppData is a po
358f0 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74  inter to a point
35900 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22  er.  ** to the "
35910 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
35920 2e 20 20 28 70 41 70 70 44 61 74 61 20 69 73 20  .  (pAppData is 
35930 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
35940 6f 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20  ointer because. 
35950 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75   ** silly C90 ru
35960 6c 65 73 20 70 72 6f 68 69 62 69 74 20 61 20 76  les prohibit a v
35970 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20  oid* from being 
35980 63 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69  cast to a functi
35990 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  on pointer.  ** 
359a0 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 74  and so we have t
359b0 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65  o go through the
359c0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f   intermediate po
359d0 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70  inter to avoid p
359e0 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65  roblems.  ** whe
359f0 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  n compiling with
35a00 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
35a10 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a  s on GCC.).  **.
35a20 20 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20    ** The FINDER 
35a30 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
35a40 73 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e  s macro is the n
35a50 61 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ame of the point
35a60 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  er to the.  ** f
35a70 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20  inder-function. 
35a80 20 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   The finder-func
35a90 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
35aa0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20  ointer to the.  
35ab0 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74  ** sqlite_io_met
35ac0 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74  hods object that
35ad0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
35ae0 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a  desired locking.
35af0 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20    ** behaviors. 
35b00 20 53 65 65 20 74 68 65 20 64 69 76 69 73 69 6f   See the divisio
35b10 6e 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e  n above that con
35b20 74 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48  tains the IOMETH
35b30 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66  ODS.  ** macro f
35b40 6f 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f  or addition info
35b50 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65  rmation on finde
35b60 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  r-functions..  *
35b70 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  *.  ** Most find
35b80 65 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ers simply retur
35b90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
35ba0 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
35bb0 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f  o_methods.  ** o
35bc0 62 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65 20  bject.  But the 
35bd0 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  "autolockIoFinde
35be0 72 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  r" available on 
35bf0 4d 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69  MacOSX does a li
35c00 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  ttle.  ** more t
35c10 68 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f  han that; it loo
35c20 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
35c30 73 74 65 6d 20 74 79 70 65 20 74 68 61 74 20 68  stem type that h
35c40 6f 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64  osts the .  ** d
35c50 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
35c60 20 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65   tries to choose
35c70 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68   an locking meth
35c80 6f 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  od appropriate f
35c90 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c  or.  ** that fil
35ca0 65 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20  esystem time..  
35cb0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49  */.  #define UNI
35cc0 58 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49  XVFS(VFSNAME, FI
35cd0 4e 44 45 52 29 20 7b 20 20 20 20 20 20 20 20 20  NDER) {         
35ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35cf0 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
35d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
35d10 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35d30 20 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69     sizeof(unixFi
35d40 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
35d50 46 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20  File */         
35d60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35d70 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20   MAX_PATHNAME,  
35d80 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
35d90 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  name */         
35da0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30           \.    0
35db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35dc0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35de0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53         \.    VFS
35df0 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20  NAME,           
35e00 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20     /* zName */  
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e20 20 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64       \.    (void
35e30 2a 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20  *)&FINDER,      
35e40 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20   /* pAppData */ 
35e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e60 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65     \.    unixOpe
35e70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
35e80 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20  * xOpen */      
35e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ea0 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74   \.    unixDelet
35eb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
35ec0 78 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20  xDelete */      
35ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35ee0 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c  .    unixAccess,
35ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
35f00 63 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20  ccess */        
35f10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35f20 20 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e     unixFullPathn
35f30 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
35f40 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  lPathname */    
35f50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
35f60 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20   unixDlOpen,    
35f70 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
35f80 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
35f90 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35fa0 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  nixDlError,     
35fb0 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
35fc0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35fd0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35fe0 78 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  xDlSym,         
35ff0 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20     /* xDlSym */ 
36000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36010 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
36020 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
36030 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20   /* xDlClose */ 
36040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36050 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e     \.    unixRan
36060 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
36070 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
36080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36090 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70   \.    unixSleep
360a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
360b0 78 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20  xSleep */       
360c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
360d0 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74  .    unixCurrent
360e0 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
360f0 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20  urrentTime */   
36100 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
36110 20 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72     unixGetLastEr
36120 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
36130 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20  LastError */    
36140 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
36150 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
36160 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
36170 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20  ntTimeInt64 */  
36180 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
36190 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixSetSystemCall
361a0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
361b0 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20  emCall */       
361c0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
361d0 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  xGetSystemCall, 
361e0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
361f0 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  Call */         
36200 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4e       \.    unixN
36210 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
36220 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
36230 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  all */          
36240 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     \.  }..  /*. 
36250 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20   ** All default 
36260 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61  VFSes for unix a
36270 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
36280 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
36290 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ray..  **.  ** N
362a0 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c  ote that the sql
362b0 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66  ite3_vfs.pNext f
362c0 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20  ield of the VFS 
362d0 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69  object is modifi
362e0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53  ed.  ** by the S
362f0 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20  QLite core when 
36300 74 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73  the VFS is regis
36310 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66  tered.  So the f
36320 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72  ollowing.  ** ar
36330 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ray cannot be co
36340 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  nst..  */.  stat
36350 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61  ic sqlite3_vfs a
36360 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51  Vfs[] = {.#if SQ
36370 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
36380 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53  ING_STYLE && (OS
36390 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69  _VXWORKS || defi
363a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a  ned(__APPLE__)).
363b0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
363c0 78 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74  x",          aut
363d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  olockIoFinder ),
363e0 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56  .#else.    UNIXV
363f0 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
36400 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65      posixIoFinde
36410 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  r ),.#endif.    
36420 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f  UNIXVFS("unix-no
36430 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49  ne",     nolockI
36440 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
36450 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74  NIXVFS("unix-dot
36460 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49  file",  dotlockI
36470 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f  oFinder ),.#if O
36480 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e  S_VXWORKS.    UN
36490 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65  IXVFS("unix-name
364a0 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64  dsem", semIoFind
364b0 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66  er ),.#endif.#if
364c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
364d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
364e0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70   UNIXVFS("unix-p
364f0 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49  osix",    posixI
36500 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21  oFinder ),.#if !
36510 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55  OS_VXWORKS.    U
36520 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f  NIXVFS("unix-flo
36530 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46  ck",    flockIoF
36540 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
36550 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
36560 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
36570 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
36580 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
36590 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61   UNIXVFS("unix-a
365a0 66 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46  fp",      afpIoF
365b0 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
365c0 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c  XVFS("unix-nfs",
365d0 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e 64 65        nfsIoFinde
365e0 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
365f0 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20  ("unix-proxy",  
36600 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20    proxyIoFinder 
36610 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  ),.#endif.  };. 
36620 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
36630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
36640 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
36650 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
36660 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e  VFSes defined in
36670 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61   the aVfs[] arra
36680 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  y */.  for(i=0; 
36690 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f  i<(sizeof(aVfs)/
366a0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76  sizeof(sqlite3_v
366b0 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  fs)); i++){.    
366c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
366d0 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69  ster(&aVfs[i], i
366e0 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
366f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
36700 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
36710 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
36720 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
36730 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72  .**.** Some oper
36740 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69  ating systems mi
36750 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73  ght need to do s
36760 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74  ome cleanup in t
36770 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  his routine,.** 
36780 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d  to release dynam
36790 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
367a0 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e   objects.  But n
367b0 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54  ot on unix..** T
367c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
367d0 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e   no-op for unix.
367e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
367f0 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20  os_end(void){ . 
36800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36810 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f  K; .}. .#endif /
36820 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  * SQLITE_OS_UNIX
36830 20 2a 2f 0a                                       */.