/ Hex Artifact Content
Login

Artifact 07dcae2de5f1aab27a16e6c6fc89fe1bb134026e:


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 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2320: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2330: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2340: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2350: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2360: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2370: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2380: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2390: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
23c0: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
23d0: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
23e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
23f0: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2400: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2410: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
2420: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
2430: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
2440: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
2450: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2460: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2480: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2490: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
24a0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
24b0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
24c0: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
24d0: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
24e0: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
24f0: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2500: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2510: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2520: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
2530: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2540: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2550: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2560: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2570: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2580: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2590: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
25a0: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
25b0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
25c0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
25d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
25e0: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
25f0: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2600: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2610: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2620: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
2630: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
2640: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
2650: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
2660: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
2670: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
2680: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2690: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
26a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
26b0: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
26c0: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
26d0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
26e0: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
26f0: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2700: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2710: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2720: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
2730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2740: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
2750: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
2760: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
2770: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
2780: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2790: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
27a0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
27b0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
27c0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
27d0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
27e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
27f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2800: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2810: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2820: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2830: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2840: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2850: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2860: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2870: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2880: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2890: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
28a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
28b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
28c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
28d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
28e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
28f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2900: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2910: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2920: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2930: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2940: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2950: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2960: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2970: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2980: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2990: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
29a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
29b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
29c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
29d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
29e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
29f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2a00: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2a10: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2a20: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2a30: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2a40: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2a50: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2a60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2a70: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2a80: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2a90: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2aa0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2ab0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2ac0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2ad0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ae0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2af0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2b00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2b10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2b30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2b40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2b50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2b70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2b80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2b90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2ba0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2bb0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2bc0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2bd0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2be0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2bf0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2c00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2c10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2c20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2c30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2c40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2c50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2c60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2c70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2c80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2c90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ca0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2cb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2cc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2cd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2ce0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2cf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2d00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2d10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2d20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2d30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2d40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2d50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2d60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2d70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2d90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2da0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2db0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2dc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2dd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2de0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2df0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2e00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2e20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2e30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2e40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2e50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2e60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2e70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2e80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2e90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2ea0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2eb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2ec0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2ed0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2ee0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2ef0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2f00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2f10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2f20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2f30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2f40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2f50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2f60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2f80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2f90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2fa0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2fc0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2fd0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2fe0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ff0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3010: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3020: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3030: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3040: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3050: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3060: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3070: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3080: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3090: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
30a0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
30b0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
30c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
30d0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
30e0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
30f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3100: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3110: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3120: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3130: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3140: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3150: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3160: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3170: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3180: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3190: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
31a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
31b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
31c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
31e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3220: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3230: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3240: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3250: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3260: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3270: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3280: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3290: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
32a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
32c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
32f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3300: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3310: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3320: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3330: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3340: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3350: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3360: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3370: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3380: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3390: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
33b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
33c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
33d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
33f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3400: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3410: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3420: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3430: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3460: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3470: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3480: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3490: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
34a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
34b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
34c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
34d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
34e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3500: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3510: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3520: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3530: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3550: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3560: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3570: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3580: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3590: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
35c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
35d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
35e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
35f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3610: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3620: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3630: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3640: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3650: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3660: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3670: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3680: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3690: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
36a0: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
36b0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
36c0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
36d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
36e0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
36f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3700: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3710: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3720: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3730: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3740: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3750: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3760: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3770: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
3780: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3790: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
37a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
37b0: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
37c0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
37d0: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
37e0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
37f0: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
3800: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
3820: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3830: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
3840: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3850: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3860: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3870: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
3880: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
3890: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
38a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
38b0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
38c0: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
38d0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
38e0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
38f0: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
3900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3910: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
3920: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
3930: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
3940: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
3950: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
3960: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
3970: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
3980: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
3990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39a0: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
39b0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
39c0: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
39d0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
39e0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
39f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3a00: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
3a10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
3a20: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
3a30: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
3a40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3a50: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
3a60: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
3a70: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
3a80: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3a90: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
3aa0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3ab0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3ac0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
3ad0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3ae0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
3af0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
3b00: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
3b10: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
3b20: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
3b30: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
3b40: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
3b50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3b60: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
3b70: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
3b80: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
3b90: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
3ba0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
3bb0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
3bc0: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
3bd0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
3be0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3bf0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
3c00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3c10: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
3c20: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
3c30: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
3c40: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
3c50: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
3c60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
3c70: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3c80: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3c90: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3ca0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
3cb0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3cc0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
3ce0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3cf0: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
3d00: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
3d10: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
3d20: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3d30: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
3d40: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3d50: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
3d60: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
3d70: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
3d80: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
3d90: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3da0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
3db0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
3dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3dd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3de0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3df0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
3e00: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
3e10: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
3e20: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
3e30: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
3e40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3e50: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
3e60: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
3e70: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
3e80: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
3e90: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
3ea0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3eb0: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
3ec0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
3ed0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
3ee0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3ef0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
3f00: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
3f10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
3f20: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
3f30: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
3f40: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
3f50: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
3f60: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
3f70: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
3f80: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
3f90: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
3fa0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
3fb0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3fc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3fd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
3fe0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
3ff0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4000: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4010: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4020: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
4030: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
4040: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
4050: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
4060: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
4070: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
4080: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
4090: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
40a0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
40b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
40c0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
40d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
40e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
40f0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4100: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4110: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4120: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
4130: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4140: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
4150: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4160: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4170: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4180: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
4190: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
41a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
41b0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
41c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
41d0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
41e0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
41f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4200: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4210: 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63  * Retry open() c
4220: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
4230: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
4240: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4250: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
4260: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20   *z, int f, int 
4270: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
4280: 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28  do{ rc = osOpen(
4290: 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20  z,f,m); }while( 
42a0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
42b0: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
42c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65   rc;.}../*.** He
42d0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
42e0: 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
42f0: 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
4300: 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
4310: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
4320: 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
4330: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
4340: 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b  fo and.** vxwork
4350: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20  sFileId objects 
4360: 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c  used by this fil
4370: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
4380: 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65  may be .** share
4390: 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
43a0: 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
43b0: 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48  ction unixMutexH
43c0: 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
43d0: 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
43e0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
43f0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
4400: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
4410: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
4420: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
4430: 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
4440: 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
4450: 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  *.**   unixEnter
4460: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
4470: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
4480: 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75  Held() );.**   u
4490: 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  nixEnterLeave().
44a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
44b0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  nixEnterMutex(vo
44c0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
44d0: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
44e0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
44f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
4500: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
4510: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
4520: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
4530: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4540: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
4550: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
4560: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
4570: 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
4580: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
4590: 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48  c int unixMutexH
45a0: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
45b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
45c0: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
45d0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
45e0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
45f0: 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
4600: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ...#if defined(S
4610: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4620: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
4630: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  BUG)./*.** Helpe
4640: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
4650: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
4660: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
4670: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
4680: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
4690: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
46a0: 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20  g represetation 
46b0: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
46c0: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
46d0: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
46e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
46f0: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
4700: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
4710: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
4720: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
4730: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
4740: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
4750: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
4760: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
4770: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
4780: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
4790: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
47a0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
47b0: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
47c0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
47d0: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
47e0: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
47f0: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
4800: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
4810: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
4820: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
4830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4840: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
4850: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
4860: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4870: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
4880: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
4890: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
48a0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
48b0: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
48c0: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
48d0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
48e0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
48f0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
4900: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
4910: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
4920: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
4930: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
4940: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
4950: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
4960: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
4970: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
4980: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
4990: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
49a0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
49b0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
49c0: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
49d0: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
49e0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
49f0: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
4a00: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
4a10: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
4a20: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4a30: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
4a40: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
4a50: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
4a60: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
4a70: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
4a80: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
4a90: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
4aa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
4ab0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
4ac0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
4ad0: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
4ae0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
4af0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
4b00: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
4b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4b20: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
4b30: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
4b40: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
4b50: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
4b60: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
4b70: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
4b80: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4b90: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
4ba0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
4bb0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
4bc0: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
4bd0: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
4be0: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
4bf0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
4c00: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
4c10: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
4c20: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
4c30: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
4c40: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
4c50: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
4c60: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
4c70: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
4c80: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
4c90: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
4ca0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4cb0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4cc0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4cd0: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
4ce0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4cf0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
4d00: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
4d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4d20: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
4d30: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4d40: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
4d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4d60: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
4d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4d80: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
4d90: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
4da0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4db0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4dc0: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4dd0: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
4de0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
4df0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
4e00: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
4e10: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
4e20: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
4e30: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
4e40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
4e50: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
4e60: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
4e70: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
4e80: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
4e90: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
4ea0: 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
4eb0: 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33  e(int h, sqlite3
4ec0: 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e  _int64 sz){.  in
4ed0: 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
4ee0: 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73   osFtruncate(h,s
4ef0: 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  z); }while( rc<0
4f00: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
4f10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
4f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4f30: 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65  outine translate
4f40: 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53  s a standard POS
4f50: 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e  IX errno code in
4f60: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
4f70: 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c  useful to the cl
4f80: 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c  ients of the sql
4f90: 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ite3 functions. 
4fa0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   Specifically, i
4fb0: 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64  t is.** intended
4fc0: 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20   to translate a 
4fd0: 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20  variety of "try 
4fe0: 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e  again" errors in
4ff0: 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a  to SQLITE_BUSY.*
5000: 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20  * and a variety 
5010: 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65  of "please close
5020: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
5030: 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73  ptor NOW" errors
5040: 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45   into .** SQLITE
5050: 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72  _IOERR.** .** Er
5060: 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74  rors during init
5070: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f  ialization of lo
5080: 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73  cks, or file sys
5090: 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20  tem support for 
50a0: 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64  locks,.** should
50b0: 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20   handle ENOLCK, 
50c0: 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53  ENOTSUP, EOPNOTS
50d0: 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  UPP separately..
50e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
50f0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
5100: 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69  ixError(int posi
5110: 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69  xError, int sqli
5120: 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69  teIOErr) {.  swi
5130: 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29  tch (posixError)
5140: 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74   {.#if 0.  /* At
5150: 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
5160: 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d  code was not com
5170: 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74  mented out. In t
5180: 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e  heory, this bran
5190: 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  ch.  ** should n
51a0: 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20  ever be hit, as 
51b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
51c0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
51d0: 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61  led after.  ** a
51e0: 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64   locking-related
51f0: 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20   function (i.e. 
5200: 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74  fcntl()) has ret
5210: 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77  urned non-zero w
5220: 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ith.  ** the val
5230: 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74  ue of errno as t
5240: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5250: 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65  t. Since a syste
5260: 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65  m call has faile
5270: 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68  d,.  ** errno sh
5280: 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  ould be non-zero
5290: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70  ..  **.  ** Desp
52a0: 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72  ite this, if err
52b0: 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72  no really is zer
52c0: 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27  o, we still don'
52d0: 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e  t want to return
52e0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  .  ** SQLITE_OK.
52f0: 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   The system call
5300: 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f   failed, and *so
5310: 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  me* SQLite error
5320: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20   should be.  ** 
5330: 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20  propagated back 
5340: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43  to the caller. C
5350: 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62  ommenting this b
5360: 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20  ranch out means 
5370: 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69  errno==0.  ** wi
5380: 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  ll be handled by
5390: 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20   the "default:" 
53a0: 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  case below..  */
53b0: 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20  .  case 0: .    
53c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
53d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65  ;.#endif..  case
53e0: 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20   EAGAIN:.  case 
53f0: 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73  ETIMEDOUT:.  cas
5400: 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20  e EBUSY:.  case 
5410: 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e  EINTR:.  case EN
5420: 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72  OLCK:  .    /* r
5430: 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20  andom NFS retry 
5440: 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75  error, unless du
5450: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
5460: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
5470: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
5480: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
5490: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
54a0: 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72  it says */.    r
54b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
54c0: 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  Y;.    .  case E
54d0: 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45  ACCES: .    /* E
54e0: 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41  ACCES is like EA
54f0: 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b  GAIN during lock
5500: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20  ing operations, 
5510: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65  but not any othe
5520: 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28  r time*/.    if(
5530: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
5540: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
5550: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
5560: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5570: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
5580: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
5590: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
55a0: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c  RDLOCK) ||..(sql
55b0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
55c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
55d0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
55e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
55f0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
5600: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
5610: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
5620: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
5630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
5640: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41  ;.    .  /* EDEA
5650: 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DLK is only poss
5660: 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74  ible if a call t
5670: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57  o fcntl(F_SETLKW
5680: 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20  ) is made. And. 
5690: 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   ** this module 
56a0: 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68  never makes such
56b0: 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65   a call. And the
56c0: 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20   code in SQLite 
56d0: 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73  itself .  ** ass
56e0: 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45  erts that SQLITE
56f0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69  _IOERR_BLOCKED i
5700: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64  s never returned
5710: 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73  . For these reas
5720: 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  ons.  ** this ca
5730: 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  se is also comme
5740: 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65  nted out. If the
5750: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74   system does set
5760: 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c   errno to EDEADL
5770: 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61  K,.  ** the defa
5780: 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ult SQLITE_IOERR
5790: 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62  _XXX code will b
57a0: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23  e returned. */.#
57b0: 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41  if 0.  case EDEA
57c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
57d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
57e0: 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20  CKED;.#endif.   
57f0: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
5800: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
5810: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
5820: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
5830: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
5840: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
5850: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
5860: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
5870: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
5880: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
5890: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
58a0: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
58b0: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
58c0: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
58d0: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
58e0: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
58f0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
5900: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
5910: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
5920: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
5930: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
5940: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
5950: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
5960: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
5970: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
5980: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
5990: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
59a0: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
59b0: 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20  :.#ifdef ESTALE 
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73      /* ESTALE is
59e0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20   not defined on 
59f0: 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20  Interix systems 
5a00: 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  */.  case ESTALE
5a10: 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  :.#endif.  case 
5a20: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
5a30: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
5a40: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
5a50: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
5a60: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
5a70: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
5a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5a90: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
5aa0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
5ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5b00: 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75  **** Begin Uniqu
5b10: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
5b20: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
5b30: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
5b40: 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20  *.**.** On most 
5b50: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
5b60: 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75  , we can get a u
5b70: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66  nique ID for a f
5b80: 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61  ile by concatena
5b90: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69  ting.** the devi
5ba0: 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ce number and th
5bb0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
5bc0: 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e   But this does n
5bd0: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
5be0: 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b  ks..** On VxWork
5bf0: 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  s, a unique file
5c00: 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65   id must be base
5c10: 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  d on the canonic
5c20: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a  al filename..**.
5c30: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
5c40: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
5c50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5c60: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73  ucture can be us
5c70: 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75  ed as a.** uniqu
5c80: 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57  e file ID in VxW
5c90: 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74  orks.  Each inst
5ca0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
5cb0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
5cc0: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
5cd0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
5ce0: 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ame.  There is a
5cf0: 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20  lso a reference 
5d00: 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20  count.  .** The 
5d10: 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63  structure is rec
5d20: 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20  laimed when the 
5d30: 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  number of pointe
5d40: 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74  rs to it drops t
5d50: 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  o.** zero..**.**
5d60: 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   There are never
5d70: 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73   very many files
5d80: 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d   open at one tim
5d90: 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72  e and lookups ar
5da0: 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f  e not.** a perfo
5db0: 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20  rmance-critical 
5dc0: 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73  path, so it is s
5dd0: 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74  ufficient to put
5de0: 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74   these.** struct
5df0: 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  ures on a linked
5e00: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   list..*/.struct
5e10: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b   vxworksFileId {
5e20: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
5e30: 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20  sFileId *pNext; 
5e40: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69   /* Next in a li
5e50: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
5e60: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
5e90: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
5ea0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  s one */.  int n
5eb0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5ed0: 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e  th of the zCanon
5ee0: 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e  icalName[] strin
5ef0: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61  g */.  char *zCa
5f00: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20  nonicalName;    
5f10: 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61       /* Canonica
5f20: 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b  l filename */.};
5f30: 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
5f40: 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71  ./* .** All uniq
5f50: 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ue filenames are
5f60: 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65   held on a linke
5f70: 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79  d list headed by
5f80: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c   this.** variabl
5f90: 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  e:.*/.static str
5fa0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
5fb0: 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  d *vxworksFileLi
5fc0: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
5fd0: 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61  implify a filena
5fe0: 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f  me into its cano
5ff0: 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79  nical form.** by
6000: 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c   making the foll
6010: 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a  owing changes:.*
6020: 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67  *.**  * removing
6030: 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e   any trailing an
6040: 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a  d duplicate /.**
6050: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20    * convert /./ 
6060: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20  into just /.**  
6070: 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f  * convert /A/../
6080: 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20   where A is any 
6090: 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f  simple name into
60a0: 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68   just /.**.** Ch
60b0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
60c0: 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e  n-place.  Return
60d0: 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65   the new name le
60e0: 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ngth..**.** The 
60f0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
6100: 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31  e is in z[0..n-1
6110: 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ].  Return the n
6120: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72  umber of.** char
6130: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69  acters in the si
6140: 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a  mplified name..*
6150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77  /.static int vxw
6160: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
6170: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29  (char *z, int n)
6180: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
6190: 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b  while( n>1 && z[
61a0: 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d  n-1]=='/' ){ n--
61b0: 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ; }.  for(i=j=0;
61c0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
61d0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b  if( z[i]=='/' ){
61e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
61f0: 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='/' ) continu
6200: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  e;.      if( z[i
6210: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c  +1]=='.' && i+2<
6220: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27  n && z[i+2]=='/'
6230: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d   ){.        i +=
6240: 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   1;.        cont
6250: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
6260: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6270: 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20  '.' && i+3<n && 
6280: 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a  z[i+2]=='.' && z
6290: 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
62a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
62b0: 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20   && z[j-1]!='/' 
62c0: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
62d0: 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d    if( j>0 ){ j--
62e0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  ; }.        i +=
62f0: 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   2;.        cont
6300: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
6310: 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d    }.    z[j++] =
6320: 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a   z[i];.  }.  z[j
6330: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
6340: 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
6350: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49   a unique file I
6360: 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  D for the given 
6370: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d  absolute pathnam
6380: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  e.  Return.** a 
6390: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76  pointer to the v
63a0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
63b0: 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74  ect.  This point
63c0: 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65  er is the unique
63d0: 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a  .** file ID..**.
63e0: 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c  ** The nRef fiel
63f0: 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73  d of the vxworks
6400: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
6410: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66   incremented bef
6420: 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ore.** the objec
6430: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  t is returned.  
6440: 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c  A new vxworksFil
6450: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72  eId object is cr
6460: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64  eated.** and add
6470: 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ed to the global
6480: 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61   list if necessa
6490: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ry..**.** If a m
64a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
64b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
64c0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
64d0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
64e0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
64f0: 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f  rksFindFileId(co
6500: 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c  nst char *zAbsol
6510: 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75  uteName){.  stru
6520: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6530: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
6540: 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e  /* search key an
6550: 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  d new file ID */
6560: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
6570: 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64  sFileId *pCandid
6580: 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  ate;   /* For lo
6590: 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74  oping over exist
65a0: 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a  ing file IDs */.
65b0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
65e0: 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  of zAbsoluteName
65f0: 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73   string */..  as
6600: 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e  sert( zAbsoluteN
6610: 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20  ame[0]=='/' );. 
6620: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
6630: 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b  (zAbsoluteName);
6640: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
6650: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
6660: 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20  (*pNew) + (n+1) 
6670: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
6680: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
6690: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
66a0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
66b0: 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  ew[1];.  memcpy(
66c0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
66d0: 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e  Name, zAbsoluteN
66e0: 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d  ame, n+1);.  n =
66f0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
6700: 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  Name(pNew->zCano
6710: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a  nicalName, n);..
6720: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
6730: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
6740: 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20  y that matching 
6750: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61  the canonical na
6760: 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e  me..  ** If foun
6770: 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  d, increment the
6780: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6790: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
67a0: 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  inter to.  ** th
67b0: 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20  e existing file 
67c0: 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ID..  */.  unixE
67d0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
67e0: 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78  or(pCandidate=vx
67f0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70  worksFileList; p
6800: 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64  Candidate; pCand
6810: 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65  idate=pCandidate
6820: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
6830: 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e  ( pCandidate->nN
6840: 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20  ame==n .     && 
6850: 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74  memcmp(pCandidat
6860: 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  e->zCanonicalNam
6870: 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  e, pNew->zCanoni
6880: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20  calName, n)==0. 
6890: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c     ){.       sql
68a0: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
68b0: 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61  .       pCandida
68c0: 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  te->nRef++;.    
68d0: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
68e0: 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  x();.       retu
68f0: 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20  rn pCandidate;. 
6900: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
6910: 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e  o match was foun
6920: 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65  d.  We will make
6930: 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a   a new file ID *
6940: 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d  /.  pNew->nRef =
6950: 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d   1;.  pNew->nNam
6960: 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = n;.  pNew->p
6970: 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69  Next = vxworksFi
6980: 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b  leList;.  vxwork
6990: 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77  sFileList = pNew
69a0: 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
69b0: 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ex();.  return p
69c0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
69d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
69e0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61  rence count on a
69f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6a00: 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20  bject.  Free.** 
6a10: 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20  the object when 
6a20: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
6a30: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
6a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a50: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
6a60: 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77  ileId(struct vxw
6a70: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29  orksFileId *pId)
6a80: 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  {.  unixEnterMut
6a90: 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
6aa0: 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pId->nRef>0 );. 
6ab0: 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pId->nRef--;.  
6ac0: 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30  if( pId->nRef==0
6ad0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76   ){.    struct v
6ae0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70  xworksFileId **p
6af0: 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76  p;.    for(pp=&v
6b00: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
6b10: 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b  *pp && *pp!=pId;
6b20: 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70   pp = &((*pp)->p
6b30: 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73  Next)){}.    ass
6b40: 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b  ert( *pp==pId );
6b50: 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e  .    *pp = pId->
6b60: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
6b70: 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20  e3_free(pId);.  
6b80: 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
6b90: 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ex();.}.#endif /
6ba0: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
6bb0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6bc0: 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46   End of Unique F
6bd0: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6be0: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6c50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
6c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ca0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f  ************* Po
6cc0: 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
6cd0: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64  *.**.** POSIX ad
6d00: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65  visory locks are
6d10: 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67   broken by desig
6d20: 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30  n.  ANSI STD 100
6d30: 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65  3.1 (1996).** se
6d40: 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69  ction 6.5.2.2 li
6d50: 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20  nes 483 through 
6d60: 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74  490 specify that
6d70: 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a   when a process.
6d80: 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72  ** sets or clear
6d90: 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f  s a lock, that o
6da0: 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64  peration overrid
6db0: 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63  es any prior loc
6dc0: 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65  ks set.** by the
6dd0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
6de0: 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  It does not expl
6df0: 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62  icitly say so, b
6e00: 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a  ut this implies.
6e10: 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72  ** that it overr
6e20: 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62  ides locks set b
6e30: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
6e40: 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65  ss using a diffe
6e50: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
6e60: 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64  criptor.  Consid
6e70: 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73  er this test cas
6e80: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
6e90: 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e  nt fd1 = open(".
6ea0: 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c  /file1", O_RDWR|
6eb0: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
6ec0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32  **       int fd2
6ed0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32   = open("./file2
6ee0: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
6ef0: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20  T, 0644);.**.** 
6f00: 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20  Suppose ./file1 
6f10: 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20  and ./file2 are 
6f20: 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  really the same 
6f30: 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a  file (because.**
6f40: 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f   one is a hard o
6f50: 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20  r symbolic link 
6f60: 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68  to the other) th
6f70: 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a  en if you set.**
6f80: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
6f90: 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20  ck on fd1, then 
6fa0: 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78  try to get an ex
6fb0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
6fc0: 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73  on fd2, it works
6fd0: 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20  .  I would have 
6fe0: 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63  expected the sec
6ff0: 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66  ond lock to.** f
7000: 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20  ail since there 
7010: 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f  was already a lo
7020: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64  ck on the file d
7030: 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75  ue to fd1..** Bu
7040: 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65  t not so.  Since
7050: 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65   both locks came
7060: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70   from the same p
7070: 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73  rocess, the.** s
7080: 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20  econd overrides 
7090: 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20  the first, even 
70a0: 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65  though they were
70b0: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   on different.**
70c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
70d0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66  s opened on diff
70e0: 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73  erent file names
70f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61  ..**.** This mea
7100: 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f  ns that we canno
7110: 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b  t use POSIX lock
7120: 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  s to synchronize
7130: 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20   file access.** 
7140: 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20  among competing 
7150: 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73  threads of the s
7160: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f  ame process.  PO
7170: 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77  SIX locks will w
7180: 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73  ork fine.** to s
7190: 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73  ynchronize acces
71a0: 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e  s for threads in
71b0: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
71c0: 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20  ses, but not.** 
71d0: 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74  threads within t
71e0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
71f0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
7200: 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65  round the proble
7210: 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  m, SQLite has to
7220: 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63   manage file loc
7230: 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ks internally.**
7240: 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68   on its own.  Wh
7250: 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74  enever a new dat
7260: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c  abase is opened,
7270: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
7280: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   the.** specific
7290: 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61   inode of the da
72a0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65  tabase file (the
72b0: 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d   inode is determ
72c0: 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  ined by the.** s
72d0: 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f  t_dev and st_ino
72e0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
72f0: 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68  tat structure th
7300: 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73  at fstat() fills
7310: 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63   in).** and chec
7320: 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65  k for locks alre
7330: 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20  ady existing on 
7340: 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65  that inode.  Whe
7350: 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63  n locks are.** c
7360: 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65  reated or remove
7370: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f  d, we have to lo
7380: 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e  ok at our own in
7390: 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
73a0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f   the.** locks to
73b0: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
73c0: 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69  thread has previ
73d0: 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b  ously set a lock
73e0: 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a   on that same.**
73f0: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41   inode..**.** (A
7400: 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66  side: The use of
7410: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61   inode numbers a
7420: 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65  s unique IDs doe
7430: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
7440: 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78  Works..** For Vx
7450: 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74  Works, we have t
7460: 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e  o use the altern
7470: 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20  ative unique ID 
7480: 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a  system based on.
7490: 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  ** canonical fil
74a0: 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d  ename and implem
74b0: 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65  ented in the pre
74c0: 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29  vious division.)
74d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
74e0: 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
74f0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
7500: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
7510: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
7520: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
7530: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
7540: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
7550: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
7560: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
7570: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
7580: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7590: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
75a0: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
75b0: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
75c0: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
75d0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
75e0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
75f0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
7600: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
7610: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
7620: 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74  both unixFile st
7630: 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e  ructures.** poin
7640: 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f  t to the same lo
7650: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  cking structure.
7660: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74    The locking st
7670: 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a  ructure keeps.**
7680: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
7690: 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b  nt (so we will k
76a0: 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65  now when to dele
76b0: 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e  te it) and a "cn
76c0: 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74  t".** field that
76d0: 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e   tells us its in
76e0: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  ternal lock stat
76f0: 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e  us.  cnt==0 mean
7700: 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  s the.** file is
7710: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d   unlocked.  cnt=
7720: 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69  =-1 means the fi
7730: 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  le has an exclus
7740: 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74  ive lock..** cnt
7750: 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  >0 means there a
7760: 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f  re cnt shared lo
7770: 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  cks on the file.
7780: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d  .**.** Any attem
7790: 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  pt to lock or un
77a0: 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73  lock a file firs
77b0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63  t checks the loc
77c0: 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  king.** structur
77d0: 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20  e.  The fcntl() 
77e0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f  system call is o
77f0: 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73  nly invoked to s
7800: 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c  et a .** POSIX l
7810: 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72  ock if the inter
7820: 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75  nal lock structu
7830: 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  re transitions b
7840: 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b  etween.** a lock
7850: 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b  ed and an unlock
7860: 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ed state..**.** 
7870: 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65  But wait:  there
7880: 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72   are yet more pr
7890: 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49  oblems with POSI
78a0: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
78b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ..**.** If you c
78c0: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
78d0: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
78e0: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
78f0: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
7900: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
7910: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
7920: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
7930: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
7940: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
7950: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
7960: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
7970: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
7980: 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69  bject.** maintai
7990: 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ns a count of th
79a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  e number of pend
79b0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  ing locks on tha
79c0: 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20   inode..** When 
79d0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
79e0: 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75  de to close an u
79f0: 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72  nixFile, if ther
7a00: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75  e are.** other u
7a10: 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20  nixFile open on 
7a20: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74  the same inode t
7a30: 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20  hat are holding 
7a40: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a  locks, the call.
7a50: 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68  ** to close() th
7a60: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
7a70: 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  r is deferred un
7a80: 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  til all of the l
7a90: 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54  ocks clear..** T
7aa0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
7ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
7ac0: 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20   a list of file 
7ad0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
7ae0: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63   need to.** be c
7af0: 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c  losed and that l
7b00: 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61  ist is walked (a
7b10: 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e  nd cleared) when
7b20: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a   the last lock.*
7b30: 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20  * clears..**.** 
7b40: 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62  Yet another prob
7b50: 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61  lem:  LinuxThrea
7b60: 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77  ds do not play w
7b70: 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c  ell with posix l
7b80: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79  ocks..**.** Many
7b90: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
7ba0: 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65  of linux use the
7bb0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69   LinuxThreads li
7bc0: 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a  brary which is.*
7bd0: 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70  * not posix comp
7be0: 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69  liant.  Under Li
7bf0: 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f  nuxThreads, a lo
7c00: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
7c10: 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74  read.** A cannot
7c20: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20   be modified or 
7c30: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
7c40: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
7c50: 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65   B..** Only thre
7c60: 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20  ad A can modify 
7c70: 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69  the lock.  Locki
7c80: 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ng behavior is c
7c90: 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65  orrect.** if the
7ca0: 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73   appliation uses
7cb0: 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76   the newer Nativ
7cc0: 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c  e Posix Thread L
7cd0: 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a  ibrary (NPTL).**
7ce0: 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68   on linux - with
7cf0: 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65   NPTL a lock cre
7d00: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41  ated by thread A
7d10: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
7d20: 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64  cks.** in thread
7d30: 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69   B.  But there i
7d40: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
7d50: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
7d60: 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64   which.** thread
7d70: 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62  ing library is b
7d80: 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74  eing used.  So t
7d90: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
7da0: 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d  o know at.** com
7db0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
7dc0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20  r or not thread 
7dd0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
7de0: 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42  ocks on thread B
7df0: 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20  ..** One has to 
7e00: 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68  do a run-time ch
7e10: 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20  eck to discover 
7e20: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
7e30: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
7e40: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  rocess..**.** SQ
7e50: 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70  Lite used to sup
7e60: 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64  port LinuxThread
7e70: 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20  s.  But support 
7e80: 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  for LinuxThreads
7e90: 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20  .** was dropped 
7ea0: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76  beginning with v
7eb0: 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53  ersion 3.7.0.  S
7ec0: 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c  QLite will still
7ed0: 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69   work with.** Li
7ee0: 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69  nuxThreads provi
7ef0: 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65  ded that (1) the
7f00: 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68  re is no more th
7f10: 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f  an one connectio
7f20: 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61  n .** per databa
7f30: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73  se file in the s
7f40: 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ame process and 
7f50: 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e  (2) database con
7f60: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e  nections.** do n
7f70: 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74  ot move across t
7f80: 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  hreads..*/../*.*
7f90: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
7fa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7fb0: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
7fc0: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
7fd0: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
7fe0: 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e  articular unixIn
7ff0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
8000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
8010: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
8020: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
8030: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
8040: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
8050: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
8060: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
8070: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
8080: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
8090: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
80a0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
80c0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
80d0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
80e0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
80f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
8100: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
8110: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
8120: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c  n.** inode.  Or,
8130: 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73   on LinuxThreads
8140: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f  , there is one o
8150: 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
8160: 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69  es for.** each i
8170: 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65  node opened by e
8180: 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ach thread..**.*
8190: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
81a0: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
81b0: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
81c0: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
81d0: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
81e0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
81f0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
8200: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
8210: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
8220: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
8230: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
8240: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
8250: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
8260: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
8270: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
8280: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
8290: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
82a0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
82b0: 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20    int nShared;  
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
82e0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
82f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8300: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
8310: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
8320: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
8330: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
8340: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8350: 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b  ar bProcessLock;
8360: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
8370: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
8380: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  k is held */.  i
8390: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
83c0: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
83d0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78  ucture */.  unix
83e0: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
83f0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
8400: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
8410: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
8420: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
8430: 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   nLock;         
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8450: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
8460: 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  nding file locks
8470: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
8480: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
8490: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
84a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
84b0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75   to close */.  u
84c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e  nixInodeInfo *pN
84d0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ext;           /
84e0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
84f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8500: 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  cts */.  unixIno
8510: 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  deInfo *pPrev;  
8520: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e           /*    .
8530: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
8540: 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  d */.#if SQLITE_
8550: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
8560: 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20  TYLE.  unsigned 
8570: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
8580: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
8590: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
85a0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
85b0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
85c0: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
85f0: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
8600: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
8610: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
8620: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
8630: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
8640: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
8650: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
8660: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8670: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
8680: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
8690: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
86a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
86b0: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
86c0: 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79  ror_x(), is only
86d0: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
86e0: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e   the macro.** un
86f0: 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  ixLogError()..**
8700: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
8710: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
8720: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
8730: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72   function and er
8740: 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  rno has been.** 
8750: 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d  set. It logs a m
8760: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
8770: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
8780: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
8790: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
87a0: 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  rno and, if poss
87b0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
87c0: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
87d0: 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  ent from strerro
87e0: 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72  r() or.** strerr
87f0: 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  or_r()..**.** Th
8800: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8810: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
8820: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
8830: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
8840: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
8850: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
8860: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
8870: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
8880: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
8890: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
88a0: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
88b0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
88c0: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
88d0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
88e0: 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e  led (e.g. "unlin
88f0: 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20  k", "open") and 
8900: 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74  the the associat
8910: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
8920: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
8930: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
8940: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
8950: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
8960: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
8970: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
8980: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
8990: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
89a0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
89b0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
89c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
89d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
89e0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
89f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
8a00: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
8a10: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
8a20: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
8a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8a40: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
8a50: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
8a60: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
8a90: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
8aa0: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
8ab0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
8ae0: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
8af0: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
8b00: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
8b10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
8b20: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
8b30: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
8b40: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
8b50: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
8b60: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
8b70: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
8b80: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
8b90: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
8ba0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
8bb0: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
8bc0: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
8bd0: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
8be0: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
8bf0: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
8c00: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
8c10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
8c20: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
8c30: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
8c40: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
8c50: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
8c60: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
8c70: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
8c80: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
8c90: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
8ca0: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
8cb0: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
8cc0: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
8cd0: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
8ce0: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
8cf0: 6f 76 69 64 65 73 20 74 68 65 20 74 68 65 20 47  ovides the the G
8d00: 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74  NU version of st
8d10: 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20  rerror_r() that 
8d20: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
8d30: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
8d40: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
8d50: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
8d60: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
8d70: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
8d80: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
8d90: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
8da0: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
8db0: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
8dc0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
8dd0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
8de0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
8df0: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
8e00: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
8e10: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
8e20: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
8e30: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
8e40: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
8e50: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
8e60: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
8e70: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
8e80: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
8e90: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
8ea0: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
8eb0: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
8ec0: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
8ed0: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
8ee0: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
8ef0: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
8f00: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
8f10: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
8f20: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
8f30: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
8f40: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
8f50: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
8f60: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
8f70: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
8f80: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
8f90: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
8fa0: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
8fb0: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
8fc0: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
8fd0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8fe0: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
8ff0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
9000: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
9010: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
9020: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
9030: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
9040: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
9050: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
9060: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
9070: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
9080: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  no);.#endif..  a
9090: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
90a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
90b0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
90c0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
90d0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
90e0: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
90f0: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
9100: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
9110: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
9120: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
9130: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
9140: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
9150: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
9160: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
9170: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
9180: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
9190: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
91a0: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
91b0: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
91c0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
91d0: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
91e0: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
91f0: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
9200: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
9210: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
9220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
9230: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
9240: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
9250: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
9260: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
9270: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
9280: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
9290: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
92a0: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
92b0: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
92c0: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
92d0: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
92e0: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
92f0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
9300: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
9310: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
9320: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
9330: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
9340: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
9350: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
9360: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
9370: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
9380: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9390: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
93a0: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
93b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
93c0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
93d0: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
93e0: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
93f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9400: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
9410: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
9420: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
9430: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
9440: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
9450: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
9460: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
9470: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
9480: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
9490: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
94a0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
94b0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
94c0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
94d0: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
94e0: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
94f0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
9500: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
9510: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
9520: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
9530: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9540: 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  p);.  }.  pInode
9550: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
9560: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
9570: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
9580: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
9590: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
95a0: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
95b0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
95c0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
95d0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
95e0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
95f0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
9600: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
9610: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
9620: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
9630: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
9640: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
9650: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9660: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9670: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
9680: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
9690: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
96a0: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
96b0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
96c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
96d0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
96e0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
96f0: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
9700: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
9710: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
9720: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
9730: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
9740: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
9750: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
9760: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
9770: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
9780: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
9790: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
97a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
97b0: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
97c0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
97d0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
97e0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
97f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9800: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
9810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9820: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
9830: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
9840: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
9850: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
9860: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
9870: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9880: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
9890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
98a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
98b0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
98c0: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
98d0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
98e0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
98f0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
9900: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
9910: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
9920: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
9930: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
9940: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
9950: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
9960: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
9970: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
9980: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
9990: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
99a0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
99b0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
99c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
99d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
99e0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
99f0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
9a00: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
9a10: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
9a20: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
9a30: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
9a40: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
9a50: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
9a60: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
9a70: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
9a80: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9a90: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9aa0: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
9ab0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
9ae0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
9af0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9b20: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
9b30: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
9b40: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
9b50: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
9b60: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
9b70: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
9b80: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
9b90: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
9ba0: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
9bb0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
9bc0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9bd0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
9be0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
9bf0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9c00: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
9c10: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
9c20: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
9c30: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
9c40: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
9c50: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
9c60: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
9c70: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
9c80: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
9c90: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
9ca0: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
9cb0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
9cc0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
9cd0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
9ce0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
9cf0: 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c  ;.#ifdef EOVERFL
9d00: 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  OW.    if( pFile
9d10: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
9d20: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
9d30: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
9d40: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
9d50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
9d60: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
9d70: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
9d80: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
9d90: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
9da0: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
9db0: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
9dc0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
9dd0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
9de0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
9df0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
9e00: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
9e10: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
9e20: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
9e30: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
9e40: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
9e50: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
9e60: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
9e70: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
9e80: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
9e90: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
9ea0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
9eb0: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
9ec0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
9ed0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
9ee0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
9ef0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
9f00: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
9f10: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
9f20: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
9f30: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
9f40: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
9f50: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
9f60: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
9f70: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
9f80: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
9f90: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
9fa0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
9fb0: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
9fc0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
9fd0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
9fe0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
9ff0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
a000: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
a010: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
a020: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
a030: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
a040: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
a050: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
a060: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
a070: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
a080: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
a090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a0a0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
a0b0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
a0c0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
a0d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
a0e0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
a0f0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a100: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
a110: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
a120: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
a130: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
a140: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
a150: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
a160: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
a170: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
a180: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
a190: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
a1a0: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
a1b0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
a1c0: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
a1d0: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
a1e0: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
a1f0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
a200: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
a210: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
a220: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
a230: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
a240: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
a250: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
a260: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
a270: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
a280: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
a290: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
a2a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a2b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
a2c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
a2d0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
a2e0: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
a2f0: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
a300: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
a310: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
a320: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
a330: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
a340: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
a350: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
a360: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
a370: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
a380: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
a390: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
a3a0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
a3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
a3c0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
a3d0: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
a3e0: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
a3f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
a400: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a410: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
a420: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
a430: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
a440: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
a450: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
a460: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
a470: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
a480: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
a490: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
a4a0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
a4b0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
a4c0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
a4d0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
a4e0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
a4f0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
a500: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
a510: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
a520: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
a530: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
a540: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
a550: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a560: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
a570: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a580: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
a590: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
a5a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
a5b0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
a5c0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
a5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a5e0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
a5f0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
a600: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
a610: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
a620: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
a630: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
a640: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
a650: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
a660: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
a670: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
a680: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
a690: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
a6a0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
a6b0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
a6c0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
a6d0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
a6e0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
a6f0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
a700: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
a710: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
a720: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
a730: 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49  ed && !pFile->pI
a740: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
a750: 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ck ){.    struct
a760: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
a770: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
a780: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
a790: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
a7a0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
a7b0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
a7c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a7d0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
a7e0: 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  if( osFcntl(pFil
a7f0: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
a800: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  lock) ){.      r
a810: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
a820: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
a830: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
a840: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a850: 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  no;.    } else i
a860: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
a870: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
a880: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
a890: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
a8a0: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
a8b0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
a8c0: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
a8d0: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
a8e0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
a8f0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
a900: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
a910: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
a920: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
a930: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
a940: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
a950: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
a960: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
a970: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
a980: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
a990: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
a9a0: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
a9b0: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
a9c0: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
a9d0: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
a9e0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
a9f0: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
aa00: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
aa10: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
aa20: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
aa30: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
aa40: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
aa50: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
aa60: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
aa70: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
aa80: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
aa90: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
aaa0: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
aab0: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
aac0: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
aad0: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
aae0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
aaf0: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
ab00: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
ab10: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
ab20: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
ab30: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
ab40: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
ab50: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
ab60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ab70: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
ab80: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
ab90: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
aba0: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
abb0: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
abc0: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
abd0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
abe0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
abf0: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
ac00: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
ac10: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
ac20: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
ac30: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
ac40: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
ac50: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
ac60: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ac70: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
ac80: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
ac90: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
aca0: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
acb0: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
acc0: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
acd0: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
ace0: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
acf0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
ad00: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ad10: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
ad20: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73  xHeld() );.  ass
ad30: 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
ad40: 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d  ;.  if( ((pFile-
ad50: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
ad60: 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c  XFILE_EXCL)!=0 |
ad70: 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  | pInode->bProce
ad80: 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28  ssLock).   && ((
ad90: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
ada0: 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
adb0: 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  LY)==0).  ){.   
adc0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
add0: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
ade0: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
adf0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
ae00: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
ae10: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
ae20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ae30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
ae40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ae50: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
ae60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ae70: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
ae80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ae90: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
aea0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
aeb0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
aec0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
aed0: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
aee0: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
aef0: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
af00: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
af10: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
af20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
af30: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
af40: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
af50: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
af60: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
af70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
af80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
af90: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
afa0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
afb0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
afc0: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
afd0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
afe0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
aff0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
b000: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
b010: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
b020: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
b030: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
b040: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
b050: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
b060: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
b070: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
b080: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
b090: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
b0a0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
b0b0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
b0c0: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
b0d0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
b0e0: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
b0f0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
b100: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
b110: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
b120: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
b130: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
b140: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
b150: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
b160: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
b170: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
b180: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
b190: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
b1a0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
b1b0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
b1c0: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
b1d0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
b1e0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
b1f0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
b200: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
b210: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
b220: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
b230: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
b240: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
b250: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
b260: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
b270: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
b280: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
b290: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
b2a0: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
b2b0: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
b2c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
b2d0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
b2e0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
b2f0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
b300: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
b310: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
b320: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
b330: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
b340: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
b350: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
b360: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
b370: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
b380: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
b390: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
b3a0: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
b3b0: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
b3c0: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
b3d0: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
b3e0: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
b3f0: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
b400: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
b410: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
b420: 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e  patible with win
b430: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d  dows systems sim
b440: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
b450: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
b460: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
b470: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
b480: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
b490: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
b4a0: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
b4b0: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
b4c0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b4d0: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
b4e0: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
b4f0: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
b500: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
b510: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
b520: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
b530: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
b540: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
b550: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
b560: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
b570: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
b580: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
b590: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
b5a0: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
b5b0: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
b5c0: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
b5d0: 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62  sful, a random b
b5e0: 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68  yte from the 'sh
b5f0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
b600: 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f  ange' is read-lo
b610: 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63  cked and the loc
b620: 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  k on the 'pendin
b630: 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64  g byte' released
b640: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72  ..  **.  ** A pr
b650: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
b660: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
b670: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
b680: 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  as a SHARED lock
b690: 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45  ..  ** A RESERVE
b6a0: 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  D lock is implem
b6b0: 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e  ented by grabbin
b6c0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
b6d0: 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65  n the.  ** 'rese
b6e0: 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a  rved byte'. .  *
b6f0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
b700: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
b710: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
b720: 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74  after it has obt
b730: 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41  ained a.  ** SHA
b740: 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44  RED lock. A PEND
b750: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  ING lock is impl
b760: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
b770: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
b780: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70  k.  ** on the 'p
b790: 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68  ending byte'. Th
b7a0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
b7b0: 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f  no new SHARED lo
b7c0: 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  cks can be.  ** 
b7d0: 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78  obtained, but ex
b7e0: 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f  isting SHARED lo
b7f0: 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  cks are allowed 
b800: 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72  to persist. A pr
b810: 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20  ocess.  ** does 
b820: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61  not have to obta
b830: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
b840: 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ck on the way to
b850: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
b860: 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65  .  ** This prope
b870: 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74  rty is used by t
b880: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72  he algorithm for
b890: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
b8a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
b8b0: 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e  * after a crash.
b8c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58  .  **.  ** An EX
b8d0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62  CLUSIVE lock, ob
b8e0: 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50  tained after a P
b8f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68  ENDING lock is h
b900: 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70  eld, is.  ** imp
b910: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
b920: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
b930: 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65  ck on the entire
b940: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b950: 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65  ** range'. Since
b960: 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73   all other locks
b970: 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d   require a read-
b980: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
b990: 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69  he bytes.  ** wi
b9a0: 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c  thin this range,
b9b0: 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
b9c0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b  at no other lock
b9d0: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68  s are held on th
b9e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
b9f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
ba00: 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20  reason a single 
ba10: 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75  byte cannot be u
ba20: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
ba30: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
ba40: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74    ** range' is t
ba50: 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e  hat some version
ba60: 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20  s of windows do 
ba70: 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64  not support read
ba80: 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20  -locks. By.  ** 
ba90: 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d  locking a random
baa0: 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e   byte from a ran
bab0: 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53  ge, concurrent S
bac0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20  HARED locks may 
bad0: 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20  exist.  ** even 
bae0: 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  if the locking p
baf0: 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73  rimitive used is
bb00: 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d   always a write-
bb10: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  lock..  */.  int
bb20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bb30: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
bb40: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
bb50: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
bb60: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
bb70: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
bb80: 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d  ;.  int tErrno =
bb90: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
bba0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
bbb0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
bbc0: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
bbd0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
bbe0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
bbf0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
bc00: 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
bc10: 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
bc20: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46  Lock),.      azF
bc30: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70  ileLock(pFile->p
bc40: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
bc50: 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ), pFile->pInode
bc60: 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
bc70: 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
bc80: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
bc90: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
bca0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
bcb0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
bcc0: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
bcd0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
bce0: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
bcf0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
bd00: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
bd10: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
bd20: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
bd30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
bd40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
bd50: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
bd60: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
bd70: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
bd80: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
bd90: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
bda0: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
bdb0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
bdc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
bdd0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
bde0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
bdf0: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
be00: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
be10: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
be20: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
be30: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
be40: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
be50: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
be60: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
be70: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
be80: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
be90: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
bea0: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
beb0: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
bec0: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
bed0: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
bee0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bef0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
bf00: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
bf10: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bf20: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
bf30: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
bf40: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
bf50: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
bf60: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
bf70: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
bf80: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
bf90: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
bfa0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
bfb0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
bfc0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
bfd0: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
bfe0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
bff0: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
c000: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
c010: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
c020: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
c030: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
c040: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
c050: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
c060: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
c070: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
c080: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
c090: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
c0a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
c0b0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
c0c0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
c0d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
c0e0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
c0f0: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
c100: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
c110: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
c120: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
c130: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
c140: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
c150: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
c160: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
c170: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
c180: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
c190: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
c1a0: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
c1b0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
c1c0: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
c1d0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
c1e0: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
c1f0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c200: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
c210: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
c220: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c230: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
c240: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
c250: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
c260: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
c270: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
c280: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
c290: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c2a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c2b0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
c2c0: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
c2d0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
c2e0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
c2f0: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
c300: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c310: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
c320: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
c330: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
c340: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
c350: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
c360: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
c370: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
c380: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
c390: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
c3a0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
c3b0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
c3c0: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
c3d0: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
c3e0: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
c3f0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c400: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
c410: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c420: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
c430: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c440: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
c450: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
c460: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
c470: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
c480: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c490: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
c4a0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
c4b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c4c0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
c4d0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c4e0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
c4f0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c500: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c510: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
c520: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
c530: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
c540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c550: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
c560: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
c570: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c580: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
c590: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
c5a0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
c5b0: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
c5c0: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
c5d0: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
c5e0: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
c5f0: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
c600: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
c610: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
c620: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
c630: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
c640: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c650: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c660: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
c670: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
c680: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c690: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c6a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
c6b0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
c6c0: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
c6d0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c6e0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
c6f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c700: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c710: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c720: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c730: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
c740: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
c760: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
c770: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
c780: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
c790: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
c7a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
c7b0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
c7c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c7d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
c7e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c7f0: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
c800: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c810: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
c820: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
c830: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
c840: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
c850: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
c860: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
c870: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
c880: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c890: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c8a0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
c8b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c8c0: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  c ){.      if( r
c8d0: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
c8e0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c8f0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
c900: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
c910: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c920: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c930: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c940: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c950: 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
c960: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
c970: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
c980: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
c990: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
c9a0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c9b0: 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
c9c0: 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
c9d0: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
c9e0: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
c9f0: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
ca00: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
ca10: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
ca20: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
ca30: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
ca40: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
ca50: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
ca60: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
ca70: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
ca80: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
ca90: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
caa0: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
cab0: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
cac0: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
cad0: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
cae0: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
caf0: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
cb00: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
cb10: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
cb20: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
cb30: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
cb40: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
cb50: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
cb60: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
cb70: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
cb80: 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
cb90: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
cba0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
cbb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
cbc0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
cbd0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
cbe0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cbf0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
cc00: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
cc10: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
cc20: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
cc30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
cc40: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
cc50: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
cc60: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
cc70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
cc80: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
cc90: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
cca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
ccb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
ccc0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
ccd0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
cce0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
ccf0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
cd00: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
cd10: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
cd20: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
cd30: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
cd40: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
cd50: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
cd60: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
cd70: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
cd80: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
cd90: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
cda0: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
cdb0: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
cdc0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
cdd0: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
cde0: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
cdf0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ce00: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
ce10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ce20: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
ce30: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
ce40: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
ce50: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
ce60: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
ce70: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
ce80: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
ce90: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
cea0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
ceb0: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
cec0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
ced0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cee0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
cef0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cf00: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
cf10: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
cf20: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
cf30: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
cf40: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
cf50: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cf60: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
cf70: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
cf80: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
cf90: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
cfa0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
cfb0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
cfc0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
cfd0: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
cfe0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
cff0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
d000: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
d010: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
d020: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
d030: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d040: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
d050: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
d060: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
d070: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
d080: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
d090: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
d0a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
d0b0: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
d0c0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
d0d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
d0e0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
d0f0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
d100: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
d110: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
d120: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
d130: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
d140: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
d150: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
d160: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
d170: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
d180: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
d190: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
d1a0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
d1b0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
d1c0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
d1d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
d1e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
d1f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
d200: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
d210: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
d220: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
d230: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
d240: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
d250: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
d260: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
d270: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
d280: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
d290: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
d2a0: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
d2b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
d2c0: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
d2d0: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
d2e0: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
d2f0: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
d300: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
d310: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
d320: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
d330: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
d340: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
d350: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
d360: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
d370: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
d380: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
d390: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
d3a0: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
d3b0: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
d3c0: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
d3d0: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
d3e0: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
d3f0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
d400: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
d410: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
d420: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
d430: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
d440: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d450: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d460: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d470: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
d480: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d490: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d4a0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
d4b0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
d4c0: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
d4d0: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
d4e0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
d4f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
d500: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
d510: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
d520: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
d530: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
d540: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
d550: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
d560: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
d570: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
d580: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
d590: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
d5a0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
d5b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d5c0: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
d5d0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
d5e0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d5f0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
d600: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
d610: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
d620: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
d630: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
d640: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
d650: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
d660: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
d670: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d680: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
d690: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
d6a0: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
d6b0: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
d6c0: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
d6d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
d6e0: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
d6f0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d700: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d710: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
d720: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
d730: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
d740: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
d750: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
d760: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
d770: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
d780: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
d790: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
d7a0: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
d7b0: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
d7c0: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
d7d0: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
d7e0: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
d7f0: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
d800: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
d810: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
d820: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
d830: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
d840: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
d850: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  /.    pFile->inN
d860: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
d870: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
d880: 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
d890: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
d8a0: 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
d8b0: 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
d8c0: 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
d8d0: 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
d8e0: 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
d8f0: 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
d900: 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
d910: 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
d920: 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
d930: 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
d940: 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
d950: 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
d960: 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
d970: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
d980: 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
d990: 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
d9a0: 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
d9b0: 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
d9c0: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
d9d0: 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
d9e0: 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
d9f0: 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
da00: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
da10: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20  ED_LOCK ){..#if 
da20: 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
da30: 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
da40: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
da50: 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
da60: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
da70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
da80: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
da90: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
daa0: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
dab0: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
dac0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
dad0: 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
dae0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
daf0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
db00: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
db10: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
db20: 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
db30: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
db40: 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
db50: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
db60: 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
db70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
db80: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
db90: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
dba0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
dbb0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
dbc0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
dbd0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dbe0: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
dbf0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
dc00: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
dc10: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
dc20: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
dc30: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
dc40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
dc50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
dc60: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
dc70: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
dc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
dc90: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dca0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
dcb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
dcc0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
dcd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dce0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
dcf0: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
dd00: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dd10: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
dd20: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dd30: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
dd40: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
dd50: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
dd60: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
dd70: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dd80: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
dd90: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
dda0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
ddb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ddc0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ddd0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
dde0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20  OERR_RDLOCK);.  
ddf0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
de00: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
de10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
de20: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
de30: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
de40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
de50: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
de60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de70: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
de80: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
de90: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dea0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
deb0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dec0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69   SHARED_FIRST+di
ded0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c  vSize;.        l
dee0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
def0: 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b  ED_SIZE-divSize;
df00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
df10: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
df20: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
df30: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
df40: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
df50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
df60: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
df70: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
df80: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
df90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
dfa0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
dfb0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
dfc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
dfd0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
dfe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dff0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
e000: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
e010: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
e020: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
e030: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  E */.      {.   
e040: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
e050: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
e060: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e070: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e080: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e090: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
e0a0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e0b0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
e0c0: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IZE;.        if(
e0d0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e0e0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
e100: 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20  heory, the call 
e110: 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  to unixFileLock(
e120: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65  ) cannot fail be
e130: 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20  cause another.  
e140: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
e150: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
e160: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f   incompatible lo
e170: 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ck. If it does, 
e180: 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
e190: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ** indicates tha
e1a0: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
e1b0: 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
e1c0: 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67  wing the locking
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
e1e0: 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20  otocol. If this 
e1f0: 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20  happens, return 
e200: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
e210: 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20  OCK. Returning. 
e220: 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
e230: 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f  TE_BUSY would co
e240: 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20  nfuse the upper 
e250: 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69  layer (in practi
e260: 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20  ce it causes .  
e270: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73          ** an as
e280: 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a  sert to fail). *
e290: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  / .          rc 
e2a0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
e2b0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  DLOCK;.         
e2c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e2d0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e2e0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e2f0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e300: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e310: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e320: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
e330: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
e340: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
e350: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
e360: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
e370: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
e380: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
e390: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
e3a0: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
e3b0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e3c0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
e3d0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e3e0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
e3f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
e400: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e410: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e420: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
e430: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e440: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
e450: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
e460: 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
e470: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
e480: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
e490: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e4a0: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
e4b0: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
e4c0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
e4d0: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
e4e0: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
e4f0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
e500: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
e510: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
e520: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
e530: 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
e540: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
e550: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
e560: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e570: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
e580: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
e590: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
e5a0: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
e5b0: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
e5c0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e5d0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
e5f0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e600: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
e610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e620: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e630: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 09 70 46 69 6c  RR_UNLOCK;..pFil
e640: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e650: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49  rrno;.        pI
e660: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
e670: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
e680: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
e690: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
e6a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e6b0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
e6c0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
e6d0: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
e6e0: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
e6f0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
e700: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
e710: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
e720: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
e730: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
e740: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
e750: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
e760: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
e770: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
e780: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
e790: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
e7a0: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
e7b0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
e7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
e7d0: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
e7e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a  e);.    }.  }...
e7f0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
e800: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e810: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e820: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
e830: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e840: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
e850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e860: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e870: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e880: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
e890: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
e8a0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
e8b0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e8c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
e8d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
e8e0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
e8f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e900: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
e910: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
e920: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
e930: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
e940: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
e950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
e960: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
e970: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
e980: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
e990: 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
e9a0: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
e9b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e9c0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
e9d0: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
e9e0: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
e9f0: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
ea00: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
ea10: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
ea20: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
ea30: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
ea40: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
ea50: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
ea60: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
ea70: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
ea80: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
ea90: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
eaa0: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
eab0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
eac0: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
ead0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
eae0: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
eaf0: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
eb00: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
eb10: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
eb20: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
eb30: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
eb40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
eb50: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
eb60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
eb70: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
eb80: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
eb90: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
eba0: 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
ebb0: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
ebc0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
ebd0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
ebe0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
ebf0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
ec00: 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
ec10: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
ec20: 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  isDelete ){.    
ec30: 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
ec40: 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
ec50: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  lName);.    }.  
ec60: 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65    vxworksRelease
ec70: 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49  FileId(pFile->pI
ec80: 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  d);.    pFile->p
ec90: 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Id = 0;.  }.#end
eca0: 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
ecb0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
ecc0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
ecd0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
ece0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
ecf0: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
ed00: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
ed10: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
ed20: 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
ed30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ed40: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
ed50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
ed60: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
ed70: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
ed80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ed90: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
eda0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
edb0: 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  )id;.  unixUnloc
edc0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
edd0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
ede0: 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69  ();..  /* unixFi
edf0: 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77  le.pInode is alw
ee00: 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20  ays valid here. 
ee10: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66  Otherwise, a dif
ee20: 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a  ferent close.  *
ee30: 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
ee40: 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
ee50: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
ee60: 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61  nstead..  */.  a
ee70: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
ee80: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
ee90: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
eea0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
eeb0: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
eec0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
eed0: 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
eee0: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
eef0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
ef00: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
ef10: 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
ef20: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
ef30: 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
ef40: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
ef50: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
ef60: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
ef70: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
ef80: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
ef90: 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
efa0: 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
efb0: 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
efc0: 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a  y closed .    **
efd0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
efe0: 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
eff0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
f000: 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
f010: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
f020: 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
f030: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
f040: 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c  ile(id);.  unixL
f050: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
f060: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
f070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
f080: 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64   of the posix ad
f090: 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c  visory lock impl
f0a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
f0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
f0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d  ************ No-
f180: 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f1b0: 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
f1c0: 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
f1d0: 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
f1e0: 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
f1f0: 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
f200: 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
f210: 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
f220: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
f230: 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
f240: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
f250: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
f260: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
f270: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
f280: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
f290: 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
f2a0: 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
f2b0: 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
f2c0: 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
f2d0: 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
f2e0: 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
f2f0: 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
f300: 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
f310: 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
f320: 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
f330: 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
f340: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
f350: 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
f360: 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
f370: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
f380: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
f390: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
f3a0: 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
f3b0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
f3c0: 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
f3d0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
f3e0: 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
f3f0: 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
f400: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
f410: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
f420: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
f430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f440: 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
f450: 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
f460: 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
f470: 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
f480: 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
f490: 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  int nolockCheckR
f4a0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
f4b0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f4c0: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
f4d0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f4e0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
f4f0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
f500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f510: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
f520: 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  nolockLock(sqlit
f530: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
f540: 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
f550: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
f560: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
f570: 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
f580: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
f590: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
f5a0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
f5b0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f5c0: 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
f5d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
f5e0: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
f5f0: 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
f600: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f610: 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  * Close the file
f620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f630: 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  nolockClose(sqli
f640: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
f650: 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
f660: 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f  ixFile(id);.}../
f670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f680: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
f690: 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  o-op lock implem
f6a0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
f710: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
f780: 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67  dot-file Locking
f790: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f7b0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c  **.** The dotfil
f7c0: 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
f7d0: 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68  entation uses th
f7e0: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73  e existance of s
f7f0: 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20  eparate lock.** 
f800: 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20  files (really a 
f810: 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f  directory) to co
f820: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
f830: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
f840: 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20  his works.** on 
f850: 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79  just about every
f860: 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
f870: 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
f880: 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
f890: 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
f8a0: 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
f8b0: 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
f8c0: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
f8d0: 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
f8e0: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
f8f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
f900: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
f910: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
f920: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
f930: 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
f940: 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
f950: 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
f960: 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
f970: 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
f980: 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
f990: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
f9a0: 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
f9b0: 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
f9c0: 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
f9d0: 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
f9e0: 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
f9f0: 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
fa00: 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
fa10: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
fa20: 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
fa30: 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
fa40: 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74  ting a subdirect
fa50: 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ory in the same 
fa60: 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
fa70: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
fa80: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
fa90: 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22  ame but with a "
faa0: 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e  .lock" extension
fab0: 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65   added..** The e
fac0: 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f  xistance of a lo
fad0: 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70  ck directory imp
fae0: 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56  lies an EXCLUSIV
faf0: 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68  E lock.  All oth
fb00: 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73  er.** lock types
fb10: 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56   (SHARED, RESERV
fb20: 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65  ED, PENDING) are
fb30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43   mapped into EXC
fb40: 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  LUSIVE..*/../*.*
fb50: 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
fb60: 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  x added to the d
fb70: 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d  ata base filenam
fb80: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
fb90: 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  eate the.** lock
fba0: 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23   directory..*/.#
fbb0: 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53  define DOTLOCK_S
fbc0: 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f  UFFIX ".lock"../
fbd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fbe0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
fbf0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
fc00: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
fc10: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
fc20: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
fc30: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
fc40: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
fc50: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
fc60: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
fc70: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
fc80: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
fc90: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
fca0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
fcb0: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
fcc0: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
fcd0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
fce0: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
fcf0: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  checking..**.** 
fd00: 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  In dotfile locki
fd10: 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63  ng, either a loc
fd20: 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64  k exists or it d
fd30: 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20  oes not.  So in 
fd40: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f  this.** variatio
fd50: 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76  n of CheckReserv
fd60: 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f  edLock(), *pResO
fd70: 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ut is set to tru
fd80: 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a  e if any lock.**
fd90: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
fda0: 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69  file and false i
fdb0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
fdc0: 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  locked..*/.stati
fdd0: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65  c int dotlockChe
fde0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
fdf0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fe00: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
fe10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fe20: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
fe30: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
fe40: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
fe50: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
fe60: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fe70: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
fe80: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
fe90: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
fea0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
feb0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
fec0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
fed0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
fee0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
fef0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
ff00: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
ff10: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
ff20: 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  er this connecti
ff30: 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  on or some other
ff40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74   connection in t
ff50: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a  he same process.
ff60: 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c      ** holds a l
ff70: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  ock on the file.
ff80: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65    No need to che
ff90: 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  ck further. */. 
ffa0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
ffb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ffc0: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c   The lock is hel
ffd0: 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  d if and only if
ffe0: 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78   the lockfile ex
fff0: 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ists */.    cons
10000 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c  t char *zLockFil
10010 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
10020 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
10030 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65  ontext;.    rese
10040 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28  rved = osAccess(
10050 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30  zLockFile, 0)==0
10060 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
10070 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
10080 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
10090 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
100a0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
100b0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
100c0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
100d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
100e0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
100f0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
10100 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
10110 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
10120 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
10130 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
10140 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
10150 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
10160 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10170 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
10180 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
10190 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
101a0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
101b0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
101c0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
101d0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
101e0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
101f0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
10200 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
10210 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
10220 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
10230 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
10240 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
10250 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
10260 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
10270 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
10280 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
10290 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
102a0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
102b0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
102c0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
102d0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
102e0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
102f0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
10300 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
10310 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
10320 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
10330 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10340 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
10350 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
10360 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
10370 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
10380 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
10390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
103a0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
103b0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
103c0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
103d0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
103e0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
103f0 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69   level..**.** Wi
10400 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  th dotfile locki
10410 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e  ng, we really on
10420 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65  ly support state
10430 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e   (4): EXCLUSIVE.
10440 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b  .** But we track
10450 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69   the other locki
10460 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e  ng levels intern
10470 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ally..*/.static 
10480 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28  int dotlockLock(
10490 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
104a0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
104b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
104c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
104d0 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
104e0 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
104f0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
10500 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72  Context;.  int r
10510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
10520 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
10530 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
10540 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c  the lock file al
10550 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41  ready exists.  A
10560 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
10570 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20  to do is adjust 
10580 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  our internal rec
10590 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ord of the lock 
105a0 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  level..  */.  if
105b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
105c0 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ck > NO_LOCK ){.
105d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
105e0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
105f0 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ;.    /* Always 
10600 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
10610 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
10620 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48  file */.#ifdef H
10630 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74  AVE_UTIME.    ut
10640 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  ime(zLockFile, N
10650 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ULL);.#else.    
10660 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
10670 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
10680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10690 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
106a0 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
106b0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63  ive lock */.  rc
106c0 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b   = osMkdir(zLock
106d0 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69  File, 0777);.  i
106e0 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f  f( rc<0 ){.    /
106f0 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
10700 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b  /create the lock
10710 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
10720 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10730 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
10740 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
10750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10760 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
10770 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
10780 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10790 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
107a0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
107b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
107c0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
107d0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
107e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
107f0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
10800 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
10810 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
10820 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10830 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10840 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10850 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10860 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
10870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10880 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
10890 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
108a0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
108b0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
108c0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
108d0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
108e0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
108f0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10900 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10910 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10920 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10930 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10940 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10950 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10960 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10970 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
10980 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
10990 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
109a0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
109b0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
109c0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
109d0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
109e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
109f0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10a00 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10a10 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10a20 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10a30 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10a40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10a50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
10a60 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
10a70 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
10a80 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
10a90 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
10aa0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
10ab0 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
10ac0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
10ad0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
10ae0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
10af0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
10b00 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
10b10 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
10b20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10b30 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
10b40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10b50 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
10b60 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  To downgrade to 
10b70 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75  shared, simply u
10b80 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
10b90 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65  al notion of the
10ba0 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  .  ** lock state
10bb0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65  .  No need to me
10bc0 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ss with the file
10bd0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
10be0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
10bf0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10c00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10c10 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10c20 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
10c30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10c40 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e    /* To fully un
10c50 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10c60 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  e, delete the lo
10c70 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73  ck file */.  ass
10c80 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
10c90 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  NO_LOCK );.  rc 
10ca0 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46  = osRmdir(zLockF
10cb0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  ile);.  if( rc<0
10cc0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44   && errno==ENOTD
10cd0 49 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69  IR ) rc = osUnli
10ce0 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20  nk(zLockFile);. 
10cf0 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
10d00 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
10d10 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b  rno;.    rc = 0;
10d20 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20  .    if( ENOENT 
10d30 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
10d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
10d50 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
10d60 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
10d70 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
10d80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10d90 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10da0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10db0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
10dc0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
10dd0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
10de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10df0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
10e00 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
10e10 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
10e20 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
10e30 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
10e40 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10e50 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10e60 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
10e70 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  c;.  if( id ){. 
10e80 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
10e90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10ea0 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
10eb0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
10ec0 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
10ed0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
10ee0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
10ef0 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
10f00 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74  xFile(id);.  ret
10f10 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10f30 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
10f40 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
10f50 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
11030 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
11040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
11060 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
11070 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
11080 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
11090 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
110a0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
110b0 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
110c0 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
110d0 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
110e0 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
110f0 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
11100 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
11110 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
11120 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
11130 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
11140 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
11150 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
11160 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
11170 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
11180 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
11190 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
111a0 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
111b0 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
111c0 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
111d0 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
111e0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
111f0 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
11200 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
11210 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
11220 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
11230 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
11240 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
11250 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
11260 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
11270 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
11280 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
11290 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
112a0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
112b0 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  WORKS../*.** Ret
112c0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
112d0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
112e0 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
112f0 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
11300 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
11310 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
11320 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
11330 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
11340 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
11350 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
11360 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11370 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11380 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
11390 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
113a0 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
113b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
113c0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
113d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
113e0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
113f0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
11400 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
11410 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
11420 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
11430 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
11440 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
11450 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
11460 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
11470 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
11480 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
11490 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
114a0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
114b0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
114c0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
114d0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
114e0 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
114f0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
11500 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11510 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
11520 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11530 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
11540 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
11550 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11560 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
11570 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11590 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
115a0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
115b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
115c0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
115d0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
115e0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
115f0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
11600 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
11610 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
11620 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
11630 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
11640 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
11650 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
11660 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
11670 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
11680 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
11690 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
116a0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
116b0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
116c0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
116d0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
116e0 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
116f0 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
11700 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
11710 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
11720 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
11730 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
11740 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
11750 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
11760 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11770 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
11780 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
11790 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
117a0 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
117b0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
117c0 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
117d0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
117e0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
117f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
11800 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
11810 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
11820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11830 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
11840 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11850 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
11860 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
11870 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
11880 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
11890 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
118a0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
118b0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
118c0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
118d0 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
118e0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
118f0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
11900 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11910 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11920 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
11930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11940 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
11950 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
11960 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
11970 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
11980 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66  erved));..#ifdef
11990 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
119a0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
119b0 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
119c0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
119d0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
119e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
119f0 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
11a00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
11a10 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
11a20 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
11a30 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
11a40 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11a50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11a60 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
11a70 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
11a80 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
11a90 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
11aa0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
11ab0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
11ac0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11ad0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11ae0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11af0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11b00 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11b10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11b20 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11b30 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11b40 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11b50 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11b60 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
11b70 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
11b80 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
11b90 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
11ba0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
11bb0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
11bc0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11bd0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11be0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11bf0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11c00 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11c10 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11c20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11c30 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11c40 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11c50 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11c60 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
11c70 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
11c80 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
11c90 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
11ca0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11cb0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11cc0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11cd0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11ce0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11cf0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11d00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11d10 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
11d20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
11d30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
11d40 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
11d50 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
11d60 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
11d70 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
11d80 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
11d90 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
11da0 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
11db0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
11dc0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
11dd0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
11de0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
11df0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
11e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
11e10 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
11e20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
11e30 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
11e40 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
11e50 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
11e60 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
11e70 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
11e80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11e90 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
11ea0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
11eb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
11ec0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11ed0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
11ee0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11ef0 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
11f00 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
11f10 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
11f20 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
11f30 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
11f40 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
11f50 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
11f60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
11f70 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
11f80 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11f90 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
11fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11fb0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
11fc0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
11fd0 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
11fe0 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
11ff0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
12000 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
12010 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12020 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
12030 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
12040 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
12050 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12060 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12070 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12080 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
12090 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
120a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
120b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
120c0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rrno;.    }.  } 
120d0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
120e0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
120f0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
12100 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
12110 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
12120 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
12130 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
12140 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
12150 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
12160 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
12170 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
12180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
12190 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
121a0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
121b0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
121c0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
121d0 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
121e0 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
121f0 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
12200 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
12210 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12220 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12230 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12240 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
12250 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
12260 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
12270 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12280 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
12290 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
122a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
122b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
122c0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
122d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
122e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
122f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
12300 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
12310 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
12320 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
12330 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
12340 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
12350 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
12360 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
12370 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
12380 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
12390 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
123a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
123b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
123c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
123d0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
123e0 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
123f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
12400 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
12410 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
12420 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
12430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
12440 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
12450 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
12460 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
12470 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12480 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
12490 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
124a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
124b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
124c0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
124d0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
124e0 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
124f0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
12500 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12510 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
12520 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12530 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
12540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12550 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
12560 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
12570 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74   */.  if( robust
12580 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12590 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66   LOCK_UN) ){.#if
125a0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
125b0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
125c0 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ORS.    return S
125d0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
125e0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
125f0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12600 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ORS */.    retur
12610 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  n SQLITE_IOERR_U
12620 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLOCK;.  }else{.
12630 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12640 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
12650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12660 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
12670 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
12680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12690 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
126a0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
126b0 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c  if( id ){.    fl
126c0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
126d0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65  _LOCK);.  }.  re
126e0 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
126f0 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
12700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
12710 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12720 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
12730 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12740 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
12750 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
12760 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
12840 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
12850 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
12880 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
12890 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
128a0 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
128b0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
128c0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
128d0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
128e0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
128f0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
12900 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
12910 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
12920 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
12930 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
12940 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
12950 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
12960 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
12970 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
12980 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
12990 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
129a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
129b0 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
129c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
129d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
129e0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
129f0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
12a00 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
12a10 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
12a20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
12a30 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
12a40 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
12a50 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
12a60 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
12a70 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
12a80 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
12a90 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
12aa0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
12ab0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
12ac0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
12ad0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
12ae0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
12af0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
12b00 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
12b10 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
12b20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12b30 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
12b40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12b50 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
12b60 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
12b70 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12b80 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
12b90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
12ba0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12bb0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
12bc0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
12bd0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
12be0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
12bf0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
12c00 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
12c10 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
12c20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12c30 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
12c40 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12c50 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
12c60 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
12c70 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
12c80 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
12c90 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
12ca0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
12cb0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
12cc0 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
12cd0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
12ce0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
12cf0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
12d00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
12d10 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12d20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
12d30 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
12d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12d50 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12d60 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12d70 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12d80 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
12d90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12da0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
12db0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
12dc0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
12dd0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
12de0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
12df0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
12e00 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
12e10 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
12e20 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
12e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12e40 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
12e50 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
12e60 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
12e70 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
12e80 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
12e90 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
12ea0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
12eb0 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
12ec0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12ed0 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
12ee0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
12ef0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12f00 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
12f10 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
12f20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
12f30 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
12f40 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
12f50 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
12f60 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
12f70 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
12f80 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
12f90 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
12fa0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
12fb0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
12fc0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
12fd0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
12fe0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
12ff0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
13000 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
13010 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
13020 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
13030 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
13040 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
13050 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
13060 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
13070 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
13080 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
13090 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
130a0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
130b0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
130c0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
130d0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
130e0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
130f0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
13100 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
13110 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
13120 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
13130 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
13140 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
13150 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13160 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13170 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
13180 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13190 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
131a0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
131b0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
131c0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
131d0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
131e0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
131f0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
13200 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
13210 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
13220 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
13230 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
13240 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13250 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13260 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
13270 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
13280 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
13290 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
132a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
132b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
132c0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
132d0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
132e0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
132f0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
13300 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
13310 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
13320 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
13330 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13340 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
13350 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13360 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13370 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
13380 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
13390 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
133a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
133b0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
133c0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
133d0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
133e0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
133f0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
13400 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
13410 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
13420 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
13430 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
13440 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13450 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13460 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13470 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
13480 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
13490 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
134a0 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
134b0 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
134c0 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
134d0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
134e0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
134f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13500 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
13510 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
13520 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
13530 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
13540 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
13550 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13560 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
13570 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
13580 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13590 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
135a0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
135b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
135c0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
135d0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
135e0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
135f0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13600 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13610 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13620 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13630 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13640 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
13650 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
13660 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13670 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13680 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13690 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
136a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
136b0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
136c0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
136d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
136e0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
136f0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
13700 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
13710 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13720 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
13730 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
13740 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
13750 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
13760 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
13770 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
13780 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
13790 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
137a0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
137b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
137c0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
137d0 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
137e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
137f0 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
13800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13810 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13820 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
13830 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
13840 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
13850 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
13860 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
13870 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
13880 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13890 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
138a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
138b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
138c0 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
138d0 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
138e0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
138f0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
13900 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
13910 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
13920 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13930 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13950 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
13960 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13970 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13980 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13990 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
139a0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
139b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
139c0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
139d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
139e0 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
139f0 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
13a00 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73  c int semClose(s
13a10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
13a20 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
13a30 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
13a40 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13a50 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63  id;.    semUnloc
13a60 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
13a70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
13a80 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
13a90 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
13aa0 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
13ab0 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
13ac0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
13ad0 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
13ae0 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
13af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13b00 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
13b10 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
13b20 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
13b30 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
13b40 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
13b50 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
13b60 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
13b70 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
13b80 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
13b90 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
13ba0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
13c70 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
13c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c90 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
13ca0 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
13cb0 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
13cc0 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
13cd0 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
13ce0 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
13cf0 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
13d00 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
13d10 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
13d20 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
13d30 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
13d40 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
13d50 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
13d60 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
13d70 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
13d80 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
13d90 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
13da0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13db0 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
13dc0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13dd0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
13de0 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
13df0 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
13e00 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
13e10 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13e20 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
13e30 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
13e40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
13e50 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
13e60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
13e70 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
13e80 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13e90 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
13ea0 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
13eb0 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
13ec0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
13ed0 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
13ee0 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
13ef0 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
13f00 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
13f10 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
13f20 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
13f30 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
13f40 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
13f50 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
13f60 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
13f70 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
13f80 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
13f90 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
13fa0 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
13fb0 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
13fc0 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
13fd0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
13fe0 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
13ff0 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
14000 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
14010 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
14020 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
14050 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
14060 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
14070 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
14080 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
14090 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
140a0 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
140b0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
140c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
140d0 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
140e0 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
140f0 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
14100 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
14110 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
14120 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
14130 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
14140 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
14150 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
14160 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
14170 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
14180 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
14190 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
141a0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
141b0 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
141c0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
141d0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
141e0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
141f0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
14200 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
14210 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
14220 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
14230 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
14240 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
14250 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
14260 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
14270 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
14280 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
14290 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
142a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
142b0 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
142c0 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
142d0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
142e0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
142f0 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
14300 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
14310 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
14320 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
14330 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
14340 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
14350 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
14360 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
14370 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
14380 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
14390 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
143a0 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
143b0 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
143c0 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
143d0 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
143e0 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
143f0 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
14400 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
14410 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
14420 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
14430 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
14440 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
14450 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
14460 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
14470 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
14480 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
14490 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
144a0 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
144b0 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
144c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
144d0 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
144e0 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
144f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
14500 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
14510 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
14520 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
14530 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
14540 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
14550 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
14580 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
14590 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
145a0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
145b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
145c0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
145d0 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
145e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
145f0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
14600 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
14610 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
14620 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73  turn rc;.  } els
14630 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e {.    return S
14640 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
14650 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14660 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
14670 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
14680 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
14690 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
146a0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
146b0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
146c0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
146d0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
146e0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
146f0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
14700 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
14710 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
14720 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
14730 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
14740 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
14750 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
14760 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
14770 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
14780 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65  tatic int afpChe
14790 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
147a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
147b0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
147c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
147d0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
147e0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
147f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14800 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
14810 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14820 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20   *context;.  .  
14830 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14850 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
14860 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
14870 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14880 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  .  context = (af
14890 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
148a0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
148b0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20  gContext;.  if( 
148c0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
148d0 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75  d ){.    *pResOu
148e0 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  t = 1;.    retur
148f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14900 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
14910 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
14920 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
14930 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
14940 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f  hreads */.  .  /
14950 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
14960 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
14970 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
14980 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
14990 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
149a0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
149b0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
149c0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
149d0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
149e0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
149f0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
14a00 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  t..   */.  if( !
14a10 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
14a20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45  /* lock the RESE
14a30 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20  RVED byte */.   
14a40 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65   int lrc = afpSe
14a50 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
14a60 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
14a70 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
14a80 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c  );  .    if( SQL
14a90 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20  ITE_OK==lrc ){. 
14aa0 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
14ab0 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
14ac0 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
14ad0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
14ae0 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
14af0 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
14b00 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c  state */.      l
14b10 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14b20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14b30 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
14b40 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
14b50 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
14b60 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
14b70 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
14b80 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c   then someone el
14b90 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20  se must have it 
14ba0 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  */.      reserve
14bb0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
14bc0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
14bd0 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
14be0 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20   rc=lrc;.    }. 
14bf0 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
14c00 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
14c10 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
14c20 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70  CK %d %d %d (afp
14c30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14c40 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
14c50 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
14c60 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
14c70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14c80 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
14c90 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
14ca0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
14cb0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
14cc0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
14cd0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
14ce0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
14cf0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
14d00 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
14d10 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
14d20 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
14d30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
14d40 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
14d50 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
14d60 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
14d70 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
14d80 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
14d90 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
14da0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
14db0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
14dc0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
14dd0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
14de0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
14df0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
14e00 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
14e10 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
14e20 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
14e30 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
14e40 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
14e50 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
14e60 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
14e70 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
14e80 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
14e90 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
14ea0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
14eb0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
14ec0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14ed0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14ee0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
14ef0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
14f00 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14f10 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
14f20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
14f30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14f40 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
14f50 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
14f60 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
14f70 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
14f80 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14f90 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
14fa0 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
14fb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14fc0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14fd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14fe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
14ff0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15000 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
15010 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
15020 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
15030 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
15040 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
15050 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15060 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
15070 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
15080 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15090 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
150a0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
150b0 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
150c0 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
150d0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
150e0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
150f0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
15100 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
15110 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
15120 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
15130 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15140 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  k), pInode->nSha
15150 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
15160 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
15170 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
15180 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
15190 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
151a0 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
151b0 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
151c0 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
151d0 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
151e0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
151f0 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
15200 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
15210 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
15220 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
15230 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
15240 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
15250 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
15260 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
15270 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20  held) (afp)\n", 
15280 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
15290 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
152a0 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
152b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
152c0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
152d0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
152e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
152f0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31  correct.  **  (1
15300 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
15310 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
15320 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
15330 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
15340 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
15350 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
15360 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
15370 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
15380 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
15390 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
153a0 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
153b0 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
153c0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
153d0 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
153e0 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
153f0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
15400 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
15410 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
15420 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
15430 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
15440 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
15450 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
15460 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15470 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
15480 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
15490 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
154a0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
154b0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
154c0 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
154d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
154e0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
154f0 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
15500 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
15510 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
15520 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
15530 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
15540 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
15550 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
15560 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
15570 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
15580 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
15590 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
155a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
155b0 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
155c0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
155d0 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
155e0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
155f0 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
15600 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15610 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
15620 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
15630 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
15640 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
15650 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
15660 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
15670 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
15680 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
15690 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
156a0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
156b0 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
156c0 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
156d0 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
156e0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
156f0 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
15700 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
15710 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15720 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
15730 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
15740 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
15750 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
15760 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
15770 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
15780 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
15790 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
157a0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
157b0 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
157c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
157d0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
157e0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
157f0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
15800 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
15810 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
15820 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
15830 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
15840 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
15850 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
15860 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
15870 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
15880 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
15890 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
158a0 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
158b0 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
158c0 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
158d0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
158e0 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
158f0 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
15900 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15910 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
15920 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
15930 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
15940 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
15950 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
15960 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
15970 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
15980 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
15990 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
159a0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
159b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
159c0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
159d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
159e0 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
159f0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
15a00 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
15a10 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
15a20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
15a30 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
15a40 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
15a50 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
15a60 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15a70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
15a80 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
15a90 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
15aa0 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
15ab0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
15ac0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
15ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
15ae0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
15af0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
15b00 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
15b10 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
15b20 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
15b30 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
15b40 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
15b50 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
15b60 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
15b70 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
15b80 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
15b90 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
15ba0 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
15bb0 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
15bc0 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
15bd0 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
15be0 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
15bf0 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
15c00 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
15c10 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15c20 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
15c30 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
15c40 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
15c50 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
15c60 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15c70 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
15c80 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
15c90 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
15ca0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
15cb0 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
15cc0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
15cd0 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
15ce0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
15cf0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
15d00 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
15d10 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
15d20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
15d30 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  c1) ) {.      pF
15d40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15d50 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20   lrc1Errno;.    
15d60 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
15d70 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15d80 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
15d90 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15da0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
15db0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
15dc0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15dd0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
15de0 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
15df0 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
15e00 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
15e10 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
15e20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15e30 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
15e40 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
15e50 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
15e60 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
15e70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
15e80 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
15e90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
15ea0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
15eb0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
15ec0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
15ed0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
15ee0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
15ef0 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
15f00 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
15f10 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
15f20 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
15f30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
15f40 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
15f50 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
15f60 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
15f70 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
15f80 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
15f90 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
15fa0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
15fb0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
15fc0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
15fd0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
15fe0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
15ff0 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
16000 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
16010 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
16020 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
16030 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
16040 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
16050 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
16060 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
16070 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
16080 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
16090 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
160a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
160b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
160c0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
160d0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
160e0 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
160f0 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
16100 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
16110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16120 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
16130 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
16140 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
16150 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
16160 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16170 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
16180 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
16190 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
161a0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
161b0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
161c0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
161d0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
161e0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
161f0 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
16200 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
16210 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
16220 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16230 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16240 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
16250 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
16280 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
16290 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
162a0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
162b0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
162c0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
162d0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
162e0 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
162f0 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
16300 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16310 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16320 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
16330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
16360 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
16370 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
16380 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16390 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
163a0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
163c0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
163d0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
163e0 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
163f0 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
16400 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
16410 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
16420 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
16430 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
16440 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
16450 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
16460 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
16470 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
16480 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
16490 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
164a0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
164b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
164c0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
164d0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
164e0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
164f0 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
16500 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
16510 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
16520 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
16530 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
16540 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
16550 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
16560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16570 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
16580 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
16590 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
165a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
165b0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
165c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
165d0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
165e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
165f0 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
16600 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
16610 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
16620 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
16630 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
16640 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
16650 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
16660 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
16670 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
16680 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
16690 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
166a0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
166b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
166c0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
166d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
166e0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
166f0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
16700 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
16710 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
16720 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
16730 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
16740 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
16750 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
16760 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
16770 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16780 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
16790 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
167a0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
167b0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
167c0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
167d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
167e0 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
167f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16800 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
16810 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16820 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
16830 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16840 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
16850 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
16860 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
16870 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
16880 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16890 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
168a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
168b0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
168c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
168d0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
168e0 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
168f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
16900 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
16910 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
16920 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
16930 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
16940 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
16950 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16960 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
16970 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
16980 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
16990 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
169a0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
169b0 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
169c0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
169d0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
169e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
169f0 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
16a00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16a10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
16a20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
16a30 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
16a40 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
16a50 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
16a60 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
16a70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
16a80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
16a90 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16aa0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
16ab0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
16ac0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
16ad0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16ae0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16af0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
16b00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16b10 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
16b20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
16b30 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
16b40 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
16b50 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
16b60 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
16b70 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
16b80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16b90 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
16ba0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
16bb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
16bc0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
16bd0 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
16be0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
16bf0 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
16c00 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
16c10 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
16c20 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
16c30 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
16c40 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
16c50 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
16c60 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
16c70 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
16c80 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
16c90 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
16ca0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
16cb0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
16cc0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
16cd0 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
16ce0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
16cf0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
16d00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16d10 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
16d20 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  rite==0.        
16d30 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
16d40 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
16d50 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
16d60 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
16d70 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
16d80 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
16d90 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
16da0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
16db0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
16dc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16dd0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16de0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16df0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16e00 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
16e10 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
16e20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16e30 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
16e40 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
16e50 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b  e->nShared>1) ){
16e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  .        /* only
16e70 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
16e80 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
16e90 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
16ea0 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64        int shared
16eb0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
16ec0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
16ed0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
16ee0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
16ef0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16f00 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
16f10 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31  edLockByte, 1, 1
16f20 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
16f30 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68  {.        skipSh
16f40 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ared = 1;.      
16f50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16f70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16f80 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
16f90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
16fa0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16fb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16fc0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
16fd0 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  , 0);.    } .   
16fe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16ff0 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
17000 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  leLock>=RESERVED
17010 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74  _LOCK && context
17020 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
17030 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17040 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17050 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
17060 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
17070 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
17080 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ){ .        cont
17090 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
170a0 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0; .      }.    
170b0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
170c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
170d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
170e0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
170f0 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20  hared>1)){.     
17100 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17110 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
17120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17140 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  && eFileLock==NO
17150 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a  _LOCK ){..    /*
17160 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
17170 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
17180 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
17190 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
171a0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
171b0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
171c0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
171d0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
171e0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
171f0 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
17200 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
17210 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
17220 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
17230 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
17240 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f  edByte;.    pIno
17250 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
17260 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
17270 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
17280 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17290 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
172a0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
172b0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
172c0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
172d0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
172e0 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72     if( !skipShar
172f0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ed ){.        rc
17300 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17310 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17320 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
17330 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
17340 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
17350 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  rc ){.        pI
17360 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
17370 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
17380 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17390 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
173a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
173b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
173c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  OK ){.      pIno
173d0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
173e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
173f0 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
17400 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
17410 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
17420 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
17430 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
17440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17450 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
17460 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
17470 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
17480 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
17490 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
174a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
174b0 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
174c0 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
174d0 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
174e0 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ext .*/.static i
174f0 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69  nt afpClose(sqli
17500 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
17510 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17520 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
17530 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
17540 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
17550 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
17560 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
17570 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
17580 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
17590 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
175a0 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
175b0 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
175c0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
175d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
175e0 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
175f0 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
17600 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
17610 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
17620 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
17630 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
17640 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
17650 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
17660 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
17670 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
17680 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
17690 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
176a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
176b0 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
176c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
176d0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
176e0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
176f0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
17700 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71  o(pFile);.    sq
17710 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
17720 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
17730 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
17740 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
17750 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
17760 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
17770 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
17780 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
17790 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
177a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
177b0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
177c0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
177d0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
177e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
177f0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
17800 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
17810 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
17820 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
17830 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
17840 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
17850 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
17860 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
17870 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
17880 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
17890 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
178a0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
178b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178c0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
178d0 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
178e0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
17900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
179c0 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
179f0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
17a00 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
17a10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
17a20 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
17a30 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
17a40 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
17a50 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
17a60 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
17a70 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
17a80 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17a90 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17aa0 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
17ab0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
17ac0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
17ad0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
17ae0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
17af0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
17b00 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
17b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
17b20 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
17b30 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
17b40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17b50 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
17b60 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
17b70 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
17b80 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
17b90 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
17ba0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
17bb0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17bc0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
17bd0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
17be0 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
17bf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
17c00 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
17c10 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
17c20 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
17c30 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
17c40 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
17c50 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
17c60 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
17c70 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
17c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
17c90 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
17ca0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
17cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cc0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
17d70 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
17d80 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
17d90 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
17da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17db0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
17dc0 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
17dd0 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
17de0 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
17df0 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
17e00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
17e10 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
17e20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
17e30 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
17e40 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
17e50 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
17e60 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
17e70 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
17e80 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
17e90 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
17ea0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
17eb0 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
17ec0 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
17ed0 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
17ee0 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
17ef0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
17f00 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
17f10 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
17f20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
17f30 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
17f40 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
17f50 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17f60 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
17f70 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
17f80 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
17f90 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
17fa0 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
17fb0 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
17fc0 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
17fd0 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
17fe0 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
17ff0 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
18000 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
18010 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
18020 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
18030 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
18040 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61  E_PREAD.** any a
18050 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75  ny form by defau
18060 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  lt, we will not 
18070 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e  attempt to defin
18080 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e  e _XOPEN_SOURCE.
18090 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20  .** See tickets 
180a0 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e  #2741 and #2681.
180b0 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
180c0 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
180d0 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
180e0 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61  iled read the la
180f0 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
18100 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
18110 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
18120 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52  tic int seekAndR
18130 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ead(unixFile *id
18140 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
18150 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42  offset, void *pB
18160 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
18170 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70  int got;.  int p
18180 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21  rior = 0;.#if (!
18190 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
181a0 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
181b0 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
181c0 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
181d0 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
181e0 52 54 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65  RT;.  do{.#if de
181f0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
18200 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65  .    got = osPre
18210 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
18220 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
18230 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18240 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
18250 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
18260 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f  _PREAD64).    go
18270 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64  t = osPread64(id
18280 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18290 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
182a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
182b0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
182c0 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20      newOffset = 
182d0 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
182e0 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
182f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18300 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
18310 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   );.    if( newO
18320 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
18330 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66  .      if( newOf
18340 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
18350 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
18360 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
18370 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
18380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28  }else{.        (
18390 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
183a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
183b0 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ..      }.      
183c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
183d0 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
183e0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
183f0 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
18400 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
18410 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
18420 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
18430 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
18440 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
18450 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
18460 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75  r = 0;.      ((u
18470 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18480 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
184a0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
184b0 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
184c0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
184d0 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
184e0 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
184f0 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
18500 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
18510 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
18520 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
18530 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
18540 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
18550 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
18560 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
18570 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
18580 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
18590 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
185a0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
185b0 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
185c0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
185d0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
185e0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
185f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
18600 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
18610 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
18620 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
18630 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
18640 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
18650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
18660 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
18670 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
18680 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
18690 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
186a0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
186b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
186c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
186d0 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
186e0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a   assert( id );..
186f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
18710 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
18720 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
18730 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
18740 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
18750 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
18760 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
18770 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
18780 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
18790 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
187a0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
187b0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
187c0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
187d0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
187e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
187f0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f   );.#endif..  go
18800 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
18810 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
18820 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
18830 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
18840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18850 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
18860 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
18870 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
18880 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
18890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
188a0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
188b0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
188c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
188d0 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
188e0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
188f0 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
18900 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
18910 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
18920 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
18930 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
18940 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
18950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18960 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
18970 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
18980 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
18990 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
189a0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
189b0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
189c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
189d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
189e0 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
189f0 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
18a00 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
18a10 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
18a20 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
18a30 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
18a40 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
18a50 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
18a60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
18a70 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
18a80 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
18a90 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
18aa0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
18ab0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
18ac0 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
18ad0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
18ae0 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
18af0 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
18b00 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
18b10 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
18b20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
18b30 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f  _PREAD).  do{ go
18b40 74 20 3d 20 6f 73 50 77 72 69 74 65 28 69 64 2d  t = osPwrite(id-
18b50 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
18b60 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20  ffset); }while( 
18b70 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
18b80 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
18b90 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18ba0 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20  64).  do{ got = 
18bb0 6f 73 50 77 72 69 74 65 36 34 28 69 64 2d 3e 68  osPwrite64(id->h
18bc0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
18bd0 73 65 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74  set);}while( got
18be0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
18bf0 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b  TR);.#else.  do{
18c00 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
18c10 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
18c20 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
18c30 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18c40 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
18c50 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  - );.    if( new
18c60 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
18c70 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f  {.      if( newO
18c80 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
18c90 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
18ca0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18cb0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
18cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18cd0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18ce0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
18cf0 09 09 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ...      }.     
18d00 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
18d10 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72  }.    got = osWr
18d20 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
18d30 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28   cnt);.  }while(
18d40 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
18d50 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66  =EINTR );.#endif
18d60 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
18d70 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
18d80 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18d90 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18da0 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  rno;.  }..  OSTR
18db0 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
18dc0 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
18dd0 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74  u\n", id->h, got
18de0 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  , offset, TIMER_
18df0 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
18e00 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
18e10 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
18e20 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
18e30 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
18e40 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18e50 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
18e60 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
18e70 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
18e80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
18e90 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
18ea0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f  _file *id, .  co
18eb0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
18ec0 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
18ed0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
18ee0 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  et .){.  unixFil
18ef0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18f00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
18f10 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
18f20 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
18f30 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20  ert( amt>0 );.. 
18f40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
18f50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
18f60 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
18f70 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
18f80 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
18f90 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
18fa0 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
18fb0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
18fc0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
18fd0 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
18fe0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75  ert( pFile->pUnu
18ff0 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
19000 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
19010 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
19020 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
19030 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
19040 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
19050 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
19060 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
19070 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
19080 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19090 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
190a0 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
190b0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
190c0 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
190d0 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
190e0 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d  than a.  ** norm
190f0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
19100 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  ) then record th
19110 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
19120 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61  database.  ** ha
19130 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  s changed.  If t
19140 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19150 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69  ounter is modifi
19160 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a  ed, record that.
19170 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20    ** fact too.. 
19180 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
19190 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29  >inNormalWrite )
191a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  {.    pFile->dbU
191b0 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54  pdate = 1;  /* T
191c0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
191d0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f  been modified */
191e0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c  .    if( offset<
191f0 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d  =24 && offset+am
19200 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69  t>=27 ){.      i
19210 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61  nt rc;.      cha
19220 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20  r oldCntr[4];.  
19230 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19240 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
19250 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64      rc = seekAnd
19260 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20  Read(pFile, 24, 
19270 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20  oldCntr, 4);.   
19280 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19290 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
192a0 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20     if( rc!=4 || 
192b0 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20  memcmp(oldCntr, 
192c0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32  &((char*)pBuf)[2
192d0 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30  4-offset], 4)!=0
192e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
192f0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
19300 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72   = 1;  /* The tr
19310 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
19320 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f  r has changed */
19330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19340 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
19350 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
19360 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
19370 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
19380 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
19390 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
193a0 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
193b0 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
193c0 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
193d0 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
193e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
193f0 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
19400 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
19410 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
19420 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
19430 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
19440 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
19450 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
19460 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
19470 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
19480 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
19490 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
194a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
194b0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
194c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
194d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
194e0 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
194f0 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
19500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19510 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
19520 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
19530 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
19540 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19550 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
19560 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
19570 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
19580 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
19590 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
195a0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
195b0 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
195c0 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
195d0 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
195e0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
195f0 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
19600 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
19610 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
19620 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  ./*.** We do not
19630 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74   trust systems t
19640 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b  o provide a work
19650 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e  ing fdatasync().
19660 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74    Some do..** Ot
19670 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20  hers do no.  To 
19680 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c  be safe, we will
19690 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20   stick with the 
196a0 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72  (slightly slower
196b0 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66  ).** fsync(). If
196c0 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79   you know that y
196d0 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20  our system does 
196e0 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e  support fdatasyn
196f0 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a  c() correctly,.*
19700 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f  * then simply co
19710 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61  mpile with -Dfda
19720 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63  tasync=fdatasync
19730 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
19740 28 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65  (fdatasync).# de
19750 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
19760 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
19770 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
19780 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
19790 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
197a0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
197b0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
197c0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
197d0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
197e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
197f0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
19800 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
19810 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
19820 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
19830 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
19840 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
19850 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
19860 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
19870 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
19880 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
19890 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
198a0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
198b0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
198c0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
198d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
198e0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
198f0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
19900 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
19910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
19920 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
19930 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
19940 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
19950 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
19960 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
19970 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
19980 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
19990 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
199a0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
199b0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
199c0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
199d0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
199e0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
199f0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
19a00 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
19a10 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
19a20 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
19a30 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
19a40 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
19a50 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
19a60 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
19a70 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
19a80 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
19a90 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
19aa0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
19ab0 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
19ac0 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
19ad0 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
19ae0 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
19af0 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
19b00 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
19b10 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
19b20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
19b30 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
19b40 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
19b50 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
19b60 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
19b70 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
19b80 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
19b90 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
19ba0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
19bb0 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
19bc0 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
19bd0 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
19be0 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
19bf0 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
19c00 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
19c10 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
19c20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
19c30 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
19c40 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
19c50 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
19c60 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
19c70 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
19c80 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
19c90 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
19ca0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
19cb0 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
19cc0 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
19cd0 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
19ce0 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
19cf0 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
19d00 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
19d10 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
19d20 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
19d30 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
19d40 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
19d50 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
19d60 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
19d70 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
19d80 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
19d90 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
19da0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
19db0 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
19dc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
19dd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19de0 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
19df0 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
19e00 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
19e10 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
19e20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
19e30 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
19e40 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
19e50 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
19e60 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
19e70 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
19e80 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
19e90 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
19ea0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
19eb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19ec0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
19ed0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
19ee0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
19ef0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
19f00 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
19f10 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
19f20 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
19f30 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
19f40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
19f50 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
19f60 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
19f70 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
19f80 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
19f90 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
19fa0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
19fb0 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
19fc0 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
19fd0 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
19fe0 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
19ff0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1a000 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1a010 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1a020 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1a030 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1a040 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1a050 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1a060 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1a070 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1a080 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1a090 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1a0a0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1a0b0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1a0c0 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1a0d0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1a0e0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1a0f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1a100 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1a110 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1a120 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1a130 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1a140 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1a150 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1a160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a170 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1a180 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1a190 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1a1a0 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1a1b0 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1a1c0 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1a1d0 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1a1e0 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1a1f0 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1a200 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1a210 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1a220 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1a230 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1a240 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1a250 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1a260 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1a270 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1a280 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1a290 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1a2a0 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1a2b0 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1a2c0 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1a2d0 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1a2e0 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1a2f0 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1a300 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1a310 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1a320 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1a330 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1a340 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1a350 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1a360 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1a370 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1a380 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1a390 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1a3a0 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1a3b0 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1a3c0 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1a3d0 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1a3e0 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1a3f0 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1a400 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1a410 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1a420 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1a430 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1a440 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1a450 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1a460 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1a470 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1a480 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1a490 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1a4a0 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1a4b0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1a4c0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1a4d0 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1a4e0 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1a4f0 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1a500 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1a510 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1a520 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1a530 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1a540 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1a550 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1a560 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1a570 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1a580 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1a590 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1a5a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1a5b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1a5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1a5d0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1a5e0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1a5f0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1a600 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1a610 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1a620 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1a630 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1a640 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1a650 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1a660 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1a670 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1a680 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1a690 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1a6a0 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1a6b0 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1a6c0 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1a6d0 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1a6e0 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1a6f0 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1a700 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1a710 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1a720 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1a730 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1a740 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1a750 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1a760 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1a770 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1a780 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1a790 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1a7a0 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1a7b0 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1a7c0 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1a7d0 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1a7e0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1a7f0 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1a800 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1a810 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1a820 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1a830 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1a840 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1a850 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1a860 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1a870 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1a880 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1a890 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1a8a0 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1a8b0 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1a8c0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1a8d0 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1a8e0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1a8f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1a900 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1a910 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1a920 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1a930 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1a940 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a950 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1a960 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1a970 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1a980 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1a990 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1a9a0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1a9b0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1a9c0 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1a9d0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1a9e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1a9f0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1aa00 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1aa10 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1aa20 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1aa30 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1aa40 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1aa50 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1aa60 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1aa70 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1aa80 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  0';.    fd = rob
1aa90 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  ust_open(zDirnam
1aaa0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1aab0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1aac0 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65  ( fd>=0 ){.#ifde
1aad0 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
1aae0 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
1aaf0 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
1ab00 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
1ab10 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
1ab20 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1ab30 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE(("OPENDIR %-
1ab40 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1ab50 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  irname));.    }.
1ab60 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1ab70 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
1ab80 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c  ?SQLITE_OK:unixL
1ab90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1aba0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1abb0 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29  pen", zDirname))
1abc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1abd0 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1abe0 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1abf0 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1ac00 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1ac10 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1ac20 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1ac30 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1ac40 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1ac50 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1ac60 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1ac70 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1ac80 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1ac90 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1aca0 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1acb0 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1acc0 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1acd0 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1ace0 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1acf0 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1ad00 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1ad10 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1ad20 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1ad30 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1ad40 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1ad50 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1ad60 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1ad70 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1ad80 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1ad90 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1ada0 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1adb0 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1adc0 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1add0 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1ade0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1adf0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1ae00 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1ae10 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1ae20 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1ae30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1ae40 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1ae50 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1ae60 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1ae70 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1ae80 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1ae90 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1aea0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1aeb0 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1aec0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1aed0 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1aee0 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1aef0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1af00 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1af10 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1af20 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1af30 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1af40 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1af50 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1af60 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1af70 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1af80 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1af90 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1afa0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1afb0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1afc0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1afd0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1afe0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1aff0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1b000 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1b010 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1b020 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1b030 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1b040 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1b050 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1b060 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1b070 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1b080 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1b090 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1b0a0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1b0b0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1b0c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1b0d0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1b0e0 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1b0f0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b100 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1b110 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1b120 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1b130 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1b140 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1b150 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1b160 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1b170 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1b180 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1b190 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1b1a0 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
1b1b0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1b1c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
1b1d0 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
1b1e0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1b1f0 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
1b200 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
1b210 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
1b220 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
1b230 63 75 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20  currance.  Many 
1b240 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
1b250 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
1b260 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
1b270 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
1b280 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
1b290 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
1b2a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
1b2b0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1b2c0 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
1b2d0 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
1b2e0 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
1b2f0 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
1b300 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
1b310 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
1b320 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
1b330 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
1b340 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
1b350 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
1b360 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
1b370 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
1b380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1b390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66  QLITE_OK && dirf
1b3a0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75  d>=0 ){.      fu
1b3b0 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1b3c0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1b3d0 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1b3e0 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1b3f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1b400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1b410 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
1b420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b430 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1b440 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1b450 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1b460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1b480 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1b490 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1b4a0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1b4b0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1b4c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b4d0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1b4e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1b4f0 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1b500 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1b510 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1b520 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1b530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b540 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1b550 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1b560 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1b570 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1b580 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1b590 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1b5a0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1b5b0 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1b5c0 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1b5d0 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1b5e0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1b5f0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1b600 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1b610 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1b620 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1b630 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1b640 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1b650 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  k ){.    nByte =
1b660 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
1b670 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
1b680 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
1b690 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
1b6a0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62  .  }..  rc = rob
1b6b0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1b6c0 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e  ile->h, (off_t)n
1b6d0 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Byte);.  if( rc 
1b6e0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1b6f0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1b700 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1b710 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1b720 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1b730 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1b740 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1b750 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  lse{.#ifndef NDE
1b760 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1b770 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1b780 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1b790 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1b7a0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1b7b0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1b7c0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1b7d0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1b7e0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1b7f0 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1b800 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1b810 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1b820 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1b830 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1b840 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1b850 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1b860 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1b870 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b880 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1b890 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1b8a0 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1b8b0 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1b8c0 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1b8d0 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1b8e0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1b8f0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1b900 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1b910 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1b920 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1b930 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1b940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b950 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1b960 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1b970 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1b980 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1b990 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1b9a0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1b9b0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1b9c0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1b9d0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1b9e0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1b9f0 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1ba00 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1ba10 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1ba20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ba30 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1ba40 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1ba50 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1ba60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1ba70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ba80 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1ba90 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1baa0 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1bab0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1bac0 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1bad0 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1bae0 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1baf0 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1bb00 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1bb10 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1bb20 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1bb30 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1bb40 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1bb50 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1bb60 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1bb70 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1bb80 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1bb90 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1bba0 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1bbb0 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1bbc0 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1bbd0 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1bbe0 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1bbf0 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1bc00 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1bc10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bc20 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1bc30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1bc40 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1bc50 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1bc60 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1bc70 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1bc80 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1bc90 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1bca0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1bcb0 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1bcc0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1bcd0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1bce0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1bcf0 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1bd00 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1bd10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bd20 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1bd30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1bd40 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1bd50 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1bd60 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1bd70 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1bd80 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1bd90 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1bda0 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1bdb0 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1bdc0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1bdd0 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1bde0 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1bdf0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1be00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1be10 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1be20 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1be30 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1be40 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1be50 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1be80 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1be90 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1beb0 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1bec0 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1bed0 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1bee0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1bef0 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
1bf00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1bf10 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
1bf20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1bf30 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1bf40 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1bf50 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1bf60 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1bf70 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1bf80 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1bf90 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1bfa0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1bfb0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1bfc0 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1bfd0 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1bfe0 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1bff0 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1c000 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1c010 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1c020 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1c030 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1c040 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1c050 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1c060 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1c070 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1c080 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1c090 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1c0a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1c0b0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1c0c0 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1c0d0 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1c0e0 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1c0f0 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1c100 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1c110 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1c120 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1c130 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1c140 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1c150 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1c160 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1c170 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1c180 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74  , fake it. First
1c190 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74   use.      ** ft
1c1a0 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74  runcate() to set
1c1b0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1c1c0 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e  then write a sin
1c1d0 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20  gle byte to.    
1c1e0 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79    ** the last by
1c1f0 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1c200 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1c210 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69  nded region. Thi
1c220 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
1c230 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65  e same technique
1c240 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74   used by glibc t
1c250 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69  o implement posi
1c260 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20  x_fallocate().  
1c270 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d      ** on system
1c280 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
1c290 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1c2a0 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ate() system cal
1c2b0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
1c2c0 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66    int nBlk = buf
1c2d0 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a  .st_blksize;  /*
1c2e0 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f   File-system blo
1c2f0 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ck size */.     
1c300 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20   i64 iWrite;    
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c320 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77  Next offset to w
1c330 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1c340 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1c350 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1c360 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1c370 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1c380 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1c390 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1c3a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1c3b0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1c3c0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1c3d0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1c3e0 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1c3f0 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1c400 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1c410 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1c420 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65     while( iWrite
1c430 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  <nSize ){.      
1c440 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73    int nWrite = s
1c450 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1c460 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1c470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1c480 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1c490 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1c4a0 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57  RITE;.        iW
1c4b0 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20  rite += nBlk;.  
1c4c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c4d0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1c4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c4f0 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
1c500 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20   and control of 
1c510 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  an open file han
1c520 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1c530 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72  nt unixFileContr
1c540 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1c550 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1c560 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78  d *pArg){.  unix
1c570 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1c580 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
1c590 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1c5a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1c5b0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1c5c0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1c5d0 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1c5e0 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1c5f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c600 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1c610 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
1c620 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1c630 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
1c640 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
1c650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c660 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1c670 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
1c680 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
1c690 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
1c6a0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
1c6b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c6c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1c6d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1c6e0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
1c6f0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1c700 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1c710 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1c720 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
1c730 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
1c740 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
1c750 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1c760 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1c770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c780 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1c790 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
1c7a0 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69  T_WAL: {.      i
1c7b0 6e 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28  nt bPersist = *(
1c7c0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
1c7d0 20 69 66 28 20 62 50 65 72 73 69 73 74 3c 30 20   if( bPersist<0 
1c7e0 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74  ){.        *(int
1c7f0 2a 29 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d  *)pArg = (pFile-
1c800 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
1c810 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
1c820 4c 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c  L)!=0;.      }el
1c830 73 65 20 69 66 28 20 62 50 65 72 73 69 73 74 3d  se if( bPersist=
1c840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1c850 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1c860 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  = ~UNIXFILE_PERS
1c870 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d  IST_WAL;.      }
1c880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1c890 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1c8a0 3d 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  = UNIXFILE_PERSI
1c8b0 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 0a  ST_WAL;.      }.
1c8c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c8d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1c8e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1c8f0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1c900 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1c910 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1c920 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1c930 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1c940 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1c950 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1c960 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1c970 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1c980 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1c990 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1c9a0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1c9b0 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1c9c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c9d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1c9e0 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1c9f0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1ca00 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1ca10 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1ca20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ca30 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1ca40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1ca50 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1ca60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1ca70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
1ca80 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1ca90 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1caa0 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
1cab0 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
1cac0 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
1cad0 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
1cae0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1caf0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1cb00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1cb10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1cb20 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  __) */.    case 
1cb30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e  SQLITE_FCNTL_SYN
1cb40 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20  C_OMITTED: {.   
1cb50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cb60 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70  _OK;  /* A no-op
1cb70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
1cb80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1cb90 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1cba0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1cbb0 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1cbc0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1cbd0 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1cbe0 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1cbf0 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1cc00 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1cc10 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1cc20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1cc30 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1cc40 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1cc50 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1cc60 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1cc70 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1cc80 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1cc90 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1cca0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1ccb0 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1ccc0 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1ccd0 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1cce0 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1ccf0 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1cd00 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1cd10 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1cd20 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
1cd30 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
1cd40 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1cd50 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
1cd60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1cd70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
1cd80 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
1cd90 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
1cda0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cdb0 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
1cdc0 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
1cdd0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
1cde0 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69  always 0 for uni
1cdf0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
1ce00 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
1ce10 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1ce20 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
1ce30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1ce40 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1ce50 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
1ce60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ce70 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  IT_WAL.../*.** O
1ce80 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
1ce90 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
1cea0 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
1ceb0 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
1cec0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
1ced0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
1cee0 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
1cef0 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
1cf00 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
1cf10 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
1cf20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
1cf30 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
1cf40 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
1cf50 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1cf60 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
1cf70 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
1cf80 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
1cf90 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
1cfa0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
1cfb0 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
1cfc0 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
1cfd0 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
1cfe0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
1cff0 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
1d000 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
1d010 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
1d020 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
1d030 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
1d040 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
1d050 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
1d060 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1d070 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
1d080 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
1d090 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
1d0a0 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
1d0b0 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
1d0c0 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
1d0d0 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
1d0e0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
1d0f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1d100 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
1d110 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
1d120 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1d130 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
1d140 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
1d150 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
1d160 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
1d170 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
1d180 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
1d190 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
1d1a0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
1d1b0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
1d1c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
1d1d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
1d1e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1d1f0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1d200 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
1d210 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
1d220 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
1d230 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
1d240 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
1d250 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
1d260 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
1d270 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
1d280 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
1d290 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
1d2a0 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
1d2b0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1d2c0 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
1d2d0 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
1d2e0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1d2f0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
1d300 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1d310 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
1d320 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
1d330 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
1d340 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
1d350 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1d360 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1d370 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1d380 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1d390 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1d3a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1d3b0 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
1d3c0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
1d3f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
1d400 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
1d410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d420 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
1d430 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
1d440 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  u16 nRegion;    
1d450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d460 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
1d470 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52  gion */.  u8 isR
1d480 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadonly;        
1d490 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d4a0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63  read-only */.  c
1d4b0 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20  har **apRegion; 
1d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
1d4d0 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61  ay of mapped sha
1d4e0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1d4f0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ns */.  int nRef
1d500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d510 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d520 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
1d530 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1d540 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1d550 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1d560 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20   /* All unixShm 
1d570 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1d580 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64   to this */.#ifd
1d590 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d5a0 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d5c0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
1d5d0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
1d5e0 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b    u8 sharedMask;
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d600 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
1d610 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1d620 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
1d630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1d640 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78  t available unix
1d650 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
1d660 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
1d670 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
1d680 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
1d690 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
1d6a0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
1d6b0 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
1d6c0 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
1d6d0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
1d6e0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
1d6f0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
1d700 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
1d710 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
1d720 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
1d730 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
1d740 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c      unixShm.pFil
1d750 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  e.**    unixShm.
1d760 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
1d770 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
1d780 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75  ad/write.  The u
1d790 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75  nixShm.pFile->mu
1d7a0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1d7b0 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
1d7c0 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
1d7d0 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
1d7e0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20  ruct unixShm {. 
1d7f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1d800 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54  hmNode;     /* T
1d810 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e  he underlying un
1d820 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1d830 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1d840 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
1d850 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d   /* Next unixShm
1d860 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75   with the same u
1d870 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1d880 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
1d890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d8a0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
1d8b0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75  e unixShmNode mu
1d8c0 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
1d8f0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
1d900 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
1d910 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
1d920 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
1d930 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1d940 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1d950 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
1d960 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1d970 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1d980 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1d990 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
1d9a0 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
1d9b0 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
1d9c0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
1d9d0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
1d9e0 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
1d9f0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
1da00 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1da10 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
1da20 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
1da30 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
1da40 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
1da50 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
1da60 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
1da70 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
1da80 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
1da90 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
1daa0 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
1dab0 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
1dac0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
1dad0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
1dae0 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
1daf0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
1db00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1db10 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
1db20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
1db30 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79  hmNode, /* Apply
1db40 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
1db50 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
1db60 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
1db70 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
1db80 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b        /* F_UNLCK
1db90 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f  , F_RDLCK, or F_
1dba0 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
1dbb0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1dbc0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
1dbd0 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  of the locking r
1dbe0 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  ange */.  int n 
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1dc10 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29  tes to lock */.)
1dc20 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
1dc30 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   f;       /* The
1dc40 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1dc50 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1dc60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
1dc70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
1dc80 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
1dc90 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f   fcntl() */..  /
1dca0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
1dcb0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1dcc0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
1dcd0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
1dce0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1dcf0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1dd00 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
1dd10 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
1dd20 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68  f==0 );..  /* Sh
1dd30 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72  ared locks never
1dd40 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20   span more than 
1dd50 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73  one byte */.  as
1dd60 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f  sert( n==1 || lo
1dd70 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20  ckType!=F_RDLCK 
1dd80 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  );..  /* Locks a
1dd90 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
1dda0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
1ddb0 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48  1 && n<SQLITE_SH
1ddc0 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  M_NLOCK );..  if
1ddd0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
1dde0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
1ddf0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
1de00 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
1de10 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30      memset(&f, 0
1de20 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20  , sizeof(f));.  
1de30 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63    f.l_type = loc
1de40 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77  kType;.    f.l_w
1de50 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
1de60 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20  ;.    f.l_start 
1de70 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f  = ofst;.    f.l_
1de80 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63  len = n;..    rc
1de90 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e   = osFcntl(pShmN
1dea0 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ode->h, F_SETLK,
1deb0 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28   &f);.    rc = (
1dec0 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49  rc!=(-1)) ? SQLI
1ded0 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42  TE_OK : SQLITE_B
1dee0 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  USY;.  }..  /* U
1def0 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c  pdate the global
1df00 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20   lock state and 
1df10 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67  do debug tracing
1df20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1df30 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20  E_DEBUG.  { u16 
1df40 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28  mask;.  OSTRACE(
1df50 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a  ("SHM-LOCK "));.
1df60 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
1df70 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
1df80 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
1df90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1dfa0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
1dfb0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
1dfc0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
1dfd0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
1dfe0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
1dff0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1e000 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e010 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1e020 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  ~mask;.    }else
1e030 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1e040 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
1e050 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
1e060 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1e070 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1e080 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
1e090 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
1e0a0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1e0b0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
1e0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1e0d0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
1e0e0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
1e0f0 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
1e100 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
1e110 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
1e120 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20  de->exclMask |= 
1e130 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
1e140 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1e150 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1e160 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1e170 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
1e180 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
1e190 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
1e1a0 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
1e1b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e1c0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
1e1d0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1e1e0 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66  CE(("read-lock f
1e1f0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65  ailed"));.    }e
1e200 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1e210 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
1e220 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
1e230 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
1e240 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
1e250 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  fst));.    }.  }
1e260 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20  .  OSTRACE((" - 
1e270 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c  afterwards %03x,
1e280 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
1e290 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1e2a0 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f  aredMask, pShmNo
1e2b0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a  de->exclMask));.
1e2c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1e2d0 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
1e2e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  .}.../*.** Purge
1e2f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1e300 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
1e310 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
1e320 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
1e330 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
1e340 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
1e350 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
1e360 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
1e370 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1e380 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
1e390 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
1e3a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e3b0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
1e3c0 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
1e3d0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
1e3e0 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
1e3f0 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
1e400 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
1e410 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
1e420 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
1e430 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
1e440 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d  ert( p->pInode==
1e450 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  pFd->pInode );. 
1e460 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1e470 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1e480 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e490 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1e4a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  {.      if( p->h
1e4b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  >=0 ){.        m
1e4c0 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
1e4d0 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
1e4e0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1e4f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e500 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
1e510 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
1e520 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e530 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
1e540 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
1e550 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
1e560 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
1e570 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
1e580 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
1e590 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
1e5a0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1e5b0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
1e5c0 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
1e5d0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
1e5e0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1e5f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e600 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1e610 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
1e620 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
1e630 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
1e640 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
1e650 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
1e660 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1e670 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
1e680 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
1e690 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
1e6a0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1e6b0 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
1e6c0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
1e6d0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1e6e0 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
1e6f0 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
1e700 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
1e710 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
1e720 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
1e730 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
1e740 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
1e750 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
1e760 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
1e770 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
1e780 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
1e790 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
1e7a0 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
1e7b0 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
1e7c0 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
1e7d0 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
1e7e0 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
1e7f0 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
1e800 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
1e810 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
1e820 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
1e830 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
1e840 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
1e850 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
1e860 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
1e870 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
1e880 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
1e890 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
1e8a0 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
1e8b0 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
1e8c0 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
1e8d0 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
1e8e0 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
1e8f0 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
1e900 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
1e910 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
1e920 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
1e930 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
1e940 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
1e950 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1e960 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
1e970 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
1e980 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
1e990 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
1e9a0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
1e9b0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
1e9c0 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
1e9d0 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
1e9e0 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
1e9f0 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
1ea00 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1ea10 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
1ea20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
1ea30 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
1ea40 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
1ea50 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
1ea60 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
1ea70 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
1ea80 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1ea90 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
1eaa0 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
1eab0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1eac0 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
1ead0 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
1eae0 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
1eaf0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
1eb00 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
1eb10 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
1eb20 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
1eb30 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
1eb40 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
1eb50 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
1eb60 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
1eb70 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
1eb80 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
1eb90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1eba0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
1ebb0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1ebc0 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
1ebd0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
1ebe0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
1ebf0 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
1ec00 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
1ec10 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
1ec20 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1ec30 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
1ec40 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
1ec50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1ec60 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
1ec70 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
1ec80 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
1ec90 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
1eca0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
1ecb0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1ecc0 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
1ecd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1ece0 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
1ecf0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
1ed00 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
1ed10 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
1ed20 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
1ed30 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
1ed40 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
1ed50 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
1ed60 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
1ed70 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
1ed80 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
1ed90 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
1eda0 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
1edb0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
1edc0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
1edd0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
1ede0 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
1edf0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1ee00 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
1ee10 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1ee20 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1ee30 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1ee40 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1ee50 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
1ee60 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
1ee70 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1eea0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
1eeb0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1eec0 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
1eed0 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
1eee0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
1eef0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
1ef00 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ef10 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
1ef20 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
1ef30 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
1ef40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ef50 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
1ef60 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
1ef70 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1ef80 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
1ef90 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
1efa0 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
1efb0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
1efc0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1efd0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1efe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
1eff0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
1f000 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
1f010 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
1f020 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
1f030 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
1f040 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1f050 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
1f060 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
1f070 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
1f080 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
1f090 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
1f0a0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
1f0b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
1f0c0 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
1f0d0 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
1f0e0 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
1f0f0 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
1f100 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
1f110 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
1f120 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
1f130 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
1f140 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
1f150 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
1f160 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
1f170 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
1f180 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
1f190 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f1a0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
1f1b0 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
1f1c0 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
1f1d0 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
1f1e0 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
1f1f0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
1f200 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  me permissions. 
1f210 54 68 65 20 61 63 74 75 61 6c 20 70 65 72 6d 69  The actual permi
1f220 73 73 69 6f 6e 73 20 74 68 65 20 66 69 6c 65 20  ssions the file 
1f230 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 2a  is created.    *
1f240 2a 20 77 69 74 68 20 61 72 65 20 73 75 62 6a 65  * with are subje
1f250 63 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ct to the curren
1f260 74 20 75 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e  t umask setting.
1f270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f280 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
1f290 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
1f2a0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
1f2b0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
1f2c0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1f2d0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
1f2e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1f2f0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1f300 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1f310 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
1f320 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
1f330 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1f340 59 29 20 2b 20 33 30 3b 0a 23 65 6c 73 65 0a 20  Y) + 30;.#else. 
1f350 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
1f360 3d 20 35 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 5 + (int)strle
1f370 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  n(pDbFd->zPath);
1f380 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
1f390 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
1f3a0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
1f3b0 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46  ShmNode) + nShmF
1f3c0 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69  ilename );.    i
1f3d0 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
1f3e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1f3f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1f400 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1f410 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rr;.    }.    me
1f420 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30  mset(pShmNode, 0
1f430 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  , sizeof(*pShmNo
1f440 64 65 29 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69  de));.    zShmFi
1f450 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64  lename = pShmNod
1f460 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
1f470 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
1f480 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
1f490 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
1f4a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1f4b0 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
1f4c0 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
1f4d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f4e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
1f4f0 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
1f500 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
1f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f520 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
1f530 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
1f540 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
1f550 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
1f560 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
1f570 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
1f580 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
1f590 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1f5a0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
1f5b0 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
1f5c0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
1f5d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
1f5e0 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
1f5f0 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
1f600 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1f610 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
1f620 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
1f630 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
1f640 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1f650 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1f660 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1f670 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
1f680 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1f690 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
1f6a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1f6b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1f6c0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1f6d0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
1f6e0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
1f6f0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1f700 63 68 61 72 20 2a 7a 52 4f 3b 0a 20 20 20 20 20  char *zRO;.     
1f710 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
1f720 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
1f730 54 3b 0a 20 20 20 20 20 20 7a 52 4f 20 3d 20 73  T;.      zRO = s
1f740 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1f750 65 74 65 72 28 70 44 62 46 64 2d 3e 7a 50 61 74  eter(pDbFd->zPat
1f760 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
1f770 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ");.      if( zR
1f780 4f 20 26 26 20 73 71 6c 69 74 65 33 47 65 74 42  O && sqlite3GetB
1f790 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b 0a 20  oolean(zRO) ){. 
1f7a0 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
1f7b0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
1f7c0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
1f7d0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
1f7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
1f7f0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
1f800 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
1f810 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
1f820 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
1f830 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
1f840 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
1f850 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  {.        if( pS
1f860 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
1f870 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
1f880 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1f890 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1f8a0 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
1f8b0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1f8c0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1f8d0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  err;.        }. 
1f8e0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1f8f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1f900 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
1f910 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1f920 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
1f930 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
1f940 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1f950 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1f960 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
1f970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f980 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
1f990 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1f9a0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
1f9b0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1f9c0 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
1f9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f9e0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1f9f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
1fa00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1fa10 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
1fa20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1fa30 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65  OPEN, "ftruncate
1fa40 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
1fa50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fa60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1fa70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fa80 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1fa90 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1faa0 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
1fab0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1fac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fad0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1fae0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1faf0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
1fb00 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
1fb10 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
1fb20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1fb30 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
1fb40 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
1fb50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1fb60 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1fb70 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1fb80 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1fb90 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1fba0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1fbb0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1fbc0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1fbd0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1fbe0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1fbf0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1fc00 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1fc10 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1fc20 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
1fc30 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
1fc40 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
1fc50 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
1fc60 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
1fc70 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
1fc80 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
1fc90 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
1fca0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
1fcb0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
1fcc0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
1fcd0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
1fce0 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
1fcf0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
1fd00 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
1fd10 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
1fd20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
1fd30 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
1fd40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1fd50 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1fd60 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1fd70 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1fd80 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1fd90 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1fda0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1fdb0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1fdc0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1fdd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fde0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1fdf0 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
1fe00 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
1fe10 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
1fe20 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
1fe30 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
1fe40 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
1fe50 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
1fe60 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
1fe70 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1fe80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fe90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1fea0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
1feb0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
1fec0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
1fed0 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
1fee0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1fef0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1ff00 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1ff10 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1ff20 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
1ff30 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1ff40 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1ff50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1ff60 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1ff70 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
1ff80 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
1ff90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1ffa0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1ffb0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1ffc0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1ffd0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1ffe0 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
1fff0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
20000 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
20010 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
20020 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
20030 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
20040 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
20050 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
20060 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
20070 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
20080 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
20090 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
200a0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
200b0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
200c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
200d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
200e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
200f0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
20100 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
20110 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
20120 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
20130 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
20140 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
20150 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
20160 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
20170 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
20180 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
20190 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
201a0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
201b0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
201c0 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
201d0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
201e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
201f0 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
20200 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
20210 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
20220 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
20230 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
20240 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
20250 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
20260 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
20270 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
20280 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
20290 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
202a0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
202c0 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
202d0 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
202e0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
202f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20300 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
20310 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
20340 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
20350 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
20360 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
20370 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
20380 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
20390 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
203a0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
203b0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
203c0 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
203d0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
203e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
203f0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
20400 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
20410 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
20420 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
20430 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
20440 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
20450 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
20460 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
20470 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
20480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20490 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
204a0 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
204b0 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
204c0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
204d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
204e0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
204f0 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
20500 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
20510 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
20520 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
20530 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
20540 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
20550 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
20560 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
20570 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
20580 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
20590 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
205a0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
205b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
205c0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
205d0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
205e0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
205f0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
20600 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
20610 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20630 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
20640 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
20650 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
20660 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
20670 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
20680 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
20690 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
206a0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
206b0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
206c0 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
206d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
206e0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
206f0 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
20700 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
20710 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
20720 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
20730 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
20740 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
20750 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
20760 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
20770 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
20780 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
20790 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
207a0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
207b0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
207c0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
207d0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
207e0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
207f0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
20800 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
20810 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
20820 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
20830 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
20840 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20850 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
20860 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
20870 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
20880 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
20890 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
208a0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
208b0 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
208c0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
208d0 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
208e0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
208f0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
20900 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
20910 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
20920 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
20930 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
20940 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65   bExtend is true
20950 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
20960 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
20970 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
20980 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
20990 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  gion..        */
209a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45  .        if( !bE
209b0 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d  xtend ) goto shm
209c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
209d0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
209e0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
209f0 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  >h, nByte) ){.  
20a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
20a10 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
20a20 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
20a30 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20 20  "ftruncate",.   
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
20a60 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
20a70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
20a80 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
20a90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20aa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
20ab0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
20ac0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
20ad0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
20ae0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
20af0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
20b00 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
20b10 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
20b20 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
20b30 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
20b40 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
20b50 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
20b60 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
20b70 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
20b80 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
20b90 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
20ba0 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
20bb0 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e  ->apRegion = apN
20bc0 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53  ew;.    while(pS
20bd0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
20be0 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20  =iRegion){.     
20bf0 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20   void *pMem;.   
20c00 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
20c10 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
20c20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20   pMem = mmap(0, 
20c30 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  szRegion,.      
20c40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20c50 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
20c60 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
20c70 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
20c80 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
20c90 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
20ca0 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ->h, pShmNode->n
20cb0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a  Region*szRegion.
20cc0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20cd0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50     if( pMem==MAP
20ce0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
20cf0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
20d00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20d10 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61  ERR_SHMMAP, "mma
20d20 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  p", pShmNode->zF
20d30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
20d40 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
20d50 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
20d60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20d70 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
20d80 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67  te3_malloc(szReg
20d90 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
20da0 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
20db0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20dc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
20dd0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
20de0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
20df0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
20e00 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  Mem, 0, szRegion
20e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20e20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
20e30 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
20e40 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
20e50 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
20e60 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
20e70 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
20e80 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
20e90 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
20ea0 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
20eb0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
20ec0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
20ed0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
20ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
20ef0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
20f00 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
20f10 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
20f20 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
20f30 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20f40 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
20f50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20f60 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
20f70 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
20f80 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
20f90 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
20fa0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
20fb0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
20fc0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
20fd0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
20fe0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
20ff0 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
21000 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
21010 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
21020 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
21030 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
21040 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
21050 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
21060 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
21070 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
21080 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
21090 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
210a0 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
210b0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
210c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
210d0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
210e0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
210f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
21100 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
21110 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
21120 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
21130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21140 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
21150 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
21160 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
21170 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
21180 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21190 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
211a0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
211b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
211e0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
211f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
21200 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
21210 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
21220 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
21230 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
21240 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
21250 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
21260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21270 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
21280 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
21290 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
212c0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
212d0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
212e0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
212f0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
21300 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
21310 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
21320 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
21330 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
21340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21350 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
21360 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
21390 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
213a0 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
213b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
213c0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
213d0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
213e0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
213f0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
21400 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
21410 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
21420 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
21430 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
21440 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
21450 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
21460 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
21470 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
21480 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
21490 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
214a0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
214b0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
214c0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
214d0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
214e0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
214f0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
21500 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
21510 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
21520 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
21530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
21540 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
21550 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
21560 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
21570 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
21580 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
21590 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
215a0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
215b0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
215c0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
215d0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
215e0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
215f0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
21600 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
21610 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
21620 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
21630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
21640 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
21650 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
21660 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
21670 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
21680 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
21690 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
216a0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
216b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
216c0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
216d0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
216e0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
216f0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
21700 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
21710 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
21720 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
21730 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
21740 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
21750 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
21760 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
21770 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
21780 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
21790 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
217a0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
217b0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
217c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
217d0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
217e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
217f0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
21800 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
21810 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
21820 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
21830 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
21840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21850 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
21860 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
21870 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21890 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
218a0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
218b0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
218c0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
218d0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
218e0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
218f0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
21900 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
21910 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
21920 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
21930 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
21940 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
21950 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
21960 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
21970 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
21980 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
21990 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
219a0 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
219b0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
219c0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
219d0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
219e0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
219f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
21a00 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
21a10 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
21a20 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
21a30 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
21a40 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
21a50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21a60 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
21a70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
21a80 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
21a90 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
21aa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21ab0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
21ac0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
21ad0 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
21ae0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
21af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21b00 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
21b10 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
21b20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
21b30 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21b40 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
21b50 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
21b60 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
21b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21ba0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
21bb0 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
21bc0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
21bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21be0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
21bf0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
21c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
21c10 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
21c20 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
21c30 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
21c40 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
21c50 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
21c60 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
21c70 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
21c80 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
21c90 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
21ca0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
21cb0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
21cc0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
21cd0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
21ce0 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
21cf0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
21d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
21d10 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
21d20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
21d40 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
21d50 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
21d60 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
21d70 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
21d80 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
21d90 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
21da0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
21db0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
21dc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
21dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21de0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
21df0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
21e00 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
21e10 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
21e20 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
21e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21e40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21e50 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
21e60 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
21e70 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
21e80 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
21e90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
21ea0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
21eb0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
21ec0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
21ed0 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
21ee0 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
21ef0 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
21f00 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
21f10 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72  etpid(), p->shar
21f20 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
21f30 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
21f40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
21f50 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
21f60 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
21f70 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
21f80 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
21f90 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
21fa0 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
21fb0 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
21fc0 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
21fd0 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
21fe0 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
21ff0 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
22000 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
22010 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
22020 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
22030 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
22040 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
22050 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
22060 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
22070 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
22080 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75  RAMETER(fd);.  u
22090 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
220a0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
220b0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
220c0 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
220d0 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
220e0 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
220f0 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
22100 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
22110 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
22120 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
22130 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
22140 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22150 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
22160 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
22170 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
22180 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
22190 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
221a0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
221b0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
221c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
221d0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
221e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
221f0 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
22200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22210 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
22220 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
22230 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
22260 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
22270 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
22280 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
22290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
222a0 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
222b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
222c0 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
222f0 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
22300 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
22310 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22330 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
22340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
22350 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
22360 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
22370 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
22380 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
22390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
223a0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
223b0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
223c0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
223d0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
223e0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
223f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
22400 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
22410 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
22420 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
22430 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
22440 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
22450 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
22460 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
22470 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22480 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
22490 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
224a0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
224b0 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
224c0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
224d0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
224e0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
224f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
22500 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
22510 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
22520 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
22530 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
22540 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
22550 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
22560 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
22570 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
22580 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
22590 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
225a0 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
225b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
225c0 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
225d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
225e0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
225f0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
22600 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
22610 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
22620 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d  lag && pShmNode-
22630 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b  >h>=0 ) osUnlink
22640 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
22650 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53  name);.    unixS
22660 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
22670 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
22680 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
22690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
226a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
226b0 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
226c0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
226d0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
226e0 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
226f0 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
22700 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
22710 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
22720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
22730 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20   */../*.** Here 
22740 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
22750 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
22760 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
22770 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
22780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
22790 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
227a0 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
227b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
227d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22810 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
22820 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
22830 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
22840 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
22850 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
22860 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
22870 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
22880 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
22890 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
228a0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
228b0 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
228c0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
228d0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
228e0 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
228f0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
22900 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
22910 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
22920 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
22930 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
22940 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
22950 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
22960 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
22970 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
22980 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
22990 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
229a0 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
229b0 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
229c0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
229d0 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
229e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
229f0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
22a00 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
22a10 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
22a20 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
22a30 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
22a40 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
22a50 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
22a60 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
22a70 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
22a80 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
22a90 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
22aa0 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
22ab0 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
22ac0 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20  nder-funtion F, 
22ad0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
22ae0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
22af0 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
22b00 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
22b10 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
22b20 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
22b30 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
22b40 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
22b50 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
22b60 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
22b70 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
22b80 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
22b90 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
22ba0 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
22bb0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
22bc0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
22bd0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
22be0 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
22bf0 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
22c00 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
22c10 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
22c20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
22c30 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
22c40 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
22c50 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
22c60 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
22c70 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
22c80 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
22c90 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
22ca0 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
22cb0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
22cc0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
22cd0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
22ce0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
22cf0 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
22d00 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
22d10 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
22d20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
22d30 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
22d40 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
22d50 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
22d60 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
22d70 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
22d80 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
22d90 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
22da0 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
22db0 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f  , METHOD, VERSIO
22dc0 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  N, CLOSE, LOCK, 
22dd0 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20  UNLOCK, CKLOCK) 
22de0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
22df0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
22e00 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
22e10 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
22e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22e50 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
22e60 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
22f80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22f90 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22fc0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23010 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23030 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23060 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23080 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
230b0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230d0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23100 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
23110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23120 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23130 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
23140 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
23150 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
23160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
23170 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23190 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
231a0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
231b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
231c0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
231f0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
23200 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
23210 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
23220 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23230 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
23240 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
23250 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
23260 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
23290 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
232a0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
232b0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
232e0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
232f0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
23300 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
23330 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  Unmap           
23340 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
23350 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20     \.};         
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233c0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
233d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
233e0 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70  ods *FINDER##Imp
233f0 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  l(const char *z,
23400 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20   unixFile *p){  
23410 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   \.  UNUSED_PARA
23420 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44  METER(z); UNUSED
23430 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20  _PARAMETER(p);  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48  \.  return &METH
23470 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OD;             
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
234b0 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .}              
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23500 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
23510 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23520 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29  *(*const FINDER)
23530 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
23540 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20  xFile *p)    \. 
23550 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70     = FINDER##Imp
23560 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61  l;../*.** Here a
23570 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71  re all of the sq
23580 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23590 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
235a0 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  h of the.** lock
235b0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
235c0 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   Functions that 
235d0 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20  return pointers 
235e0 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  to these methods
235f0 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65  .** are also cre
23600 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f  ated..*/.IOMETHO
23610 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e  DS(.  posixIoFin
23620 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
23630 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
23640 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73  on name */.  pos
23650 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ixIoMethods,    
23660 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23670 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23680 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
236b0 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
236c0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
236d0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
236e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
236f0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
23700 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23710 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
23720 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
23730 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23740 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
23750 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
23760 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
23770 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
23780 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23790 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
237a0 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
237b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
237c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
237d0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
237e0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
237f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
23800 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
23810 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23830 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
23840 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
23850 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
23860 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23870 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
23880 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
23890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
238a0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
238b0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
238c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
238d0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
238e0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
238f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
23900 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23910 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
23920 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
23930 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
23940 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
23950 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
23960 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
23970 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
23980 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
23990 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
239a0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
239d0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
239e0 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a00 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
23a10 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a30 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
23a40 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
23a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23a60 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
23a70 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
23a80 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20  eservedLock  /* 
23a90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23aa0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ck method */.)..
23ab0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
23ac0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
23ad0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  && !OS_VXWORKS.I
23ae0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
23af0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
23b00 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
23b10 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
23b20 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
23b30 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
23b40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23b50 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
23b60 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
23b90 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
23ba0 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
23bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
23bc0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
23bd0 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
23be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
23bf0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
23c00 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
23c10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
23c20 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23c30 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
23c40 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
23c50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
23c60 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
23c70 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
23c80 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
23c90 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
23ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23cb0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
23cc0 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
23cd0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
23ce0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
23cf0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
23d00 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
23d30 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
23d40 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d60 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
23d70 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d90 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
23da0 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23dc0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
23dd0 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
23de0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
23df0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
23e00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
23e10 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
23e20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
23e30 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
23e40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
23e50 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
23e60 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23e70 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
23e80 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
23e90 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23eb0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23ec0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
23ed0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ef0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
23f00 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
23f10 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
23f20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23f30 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
23f40 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
23f50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
23f60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
23f70 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
23f80 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23f90 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
23fa0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
23fb0 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
23fc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23fd0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
23fe0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
23ff0 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
24000 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
24010 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
24020 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
24030 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
24040 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
24050 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
24060 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
24070 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
24080 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
24090 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
240a0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
240b0 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
240c0 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
240d0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
240e0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
240f0 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
24100 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
24110 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
24120 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
24130 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
24140 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
24150 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
24160 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24170 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
24180 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
24190 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
241a0 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
241b0 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
241c0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
241d0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
241e0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
241f0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24200 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
24210 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
24220 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
24230 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
24240 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
24250 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
24260 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
24270 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
24280 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
24290 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
242a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
242b0 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
242c0 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
242d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
242e0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
242f0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
24300 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
24310 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
24320 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
24330 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
24360 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
24370 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
24380 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24390 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
243a0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
243b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
243c0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
243d0 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
243e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
243f0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
24400 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
24410 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
24420 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
24430 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
24440 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
24450 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
24460 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
24470 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
24480 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
24490 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
244a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
244b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
244c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
244d0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
244e0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
244f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
24500 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
24510 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
24520 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
24530 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
24540 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
24550 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
24580 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
24590 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245b0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
245c0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
245f0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
24620 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
24630 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
24640 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
24650 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
24660 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
24670 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24680 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
24690 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
246a0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
246b0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
246c0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
246d0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
246e0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
246f0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
24700 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
24710 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
24720 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
24730 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
24740 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
24750 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
24760 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
24770 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
24780 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
24790 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
247a0 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
247b0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
247c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
247d0 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
247e0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
247f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
24800 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
24810 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
24820 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
24830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24840 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
24850 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
24860 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
24870 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
24880 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
24890 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
248a0 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
248b0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
248c0 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
248d0 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
248e0 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
248f0 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
24900 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
24910 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
24920 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
24930 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
24940 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
24950 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
24960 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
24970 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
24980 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
24990 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
249a0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
249b0 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
249c0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
249d0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
249e0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
249f0 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
24a00 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
24a10 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
24a20 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
24a30 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
24a40 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
24a50 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
24a60 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
24a70 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
24a80 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
24a90 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
24aa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
24ab0 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
24ac0 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
24ad0 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
24ae0 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
24af0 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
24b00 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
24b10 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
24b20 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
24b30 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
24b40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
24b50 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
24b60 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
24b70 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
24b80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
24b90 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
24ba0 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
24bb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
24bc0 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
24bd0 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
24be0 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
24bf0 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
24c00 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
24c10 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
24c20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
24c30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
24c40 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
24c50 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
24c60 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
24c70 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
24c80 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
24c90 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
24ca0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
24cb0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
24cc0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
24cd0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
24ce0 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
24cf0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
24d00 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
24d10 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
24d20 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
24d30 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
24d40 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
24d50 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
24d60 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
24d70 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
24d80 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
24d90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
24da0 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
24db0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
24dc0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
24dd0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
24de0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
24df0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
24e00 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
24e10 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
24e20 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
24e30 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
24e40 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
24e50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
24e60 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
24e70 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
24e80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
24e90 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
24ea0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
24eb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
24ec0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
24ed0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
24ee0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
24ef0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
24f00 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
24f10 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
24f20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
24f30 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
24f40 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
24f50 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
24f60 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b  is is for VXWork
24f70 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
24f80 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
24f90 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
24fa0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
24fb0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
24fc0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
24fd0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
24fe0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
24ff0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
25000 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
25010 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
25020 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
25030 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
25040 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
25050 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
25060 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
25070 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
25080 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
25090 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
250a0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
250b0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
250c0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
250d0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
250e0 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
250f0 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
25100 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
25110 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
25120 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
25130 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
25140 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
25150 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
25160 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
25170 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
25180 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
25190 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
251a0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
251b0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
251c0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
251d0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
251e0 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
251f0 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
25200 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
25210 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
25220 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
25230 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a   &semIoMethods;.
25240 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
25250 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
25260 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
25270 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
25280 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
25290 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
252a0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
252b0 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  l;..#endif /* OS
252c0 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
252d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
252e0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
252f0 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
25300 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
25310 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20   to a IO method 
25320 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a  finder function:
25330 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73  .*/.typedef cons
25340 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
25350 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74  hods *(*finder_t
25360 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ype)(const char*
25370 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f  ,unixFile*);.../
25380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
253d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
253f0 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
25400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
25420 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
25430 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
25440 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
25450 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
25460 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
25470 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ct..*/../*.** In
25480 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
25490 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69  tents of the uni
254a0 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
254b0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49  pointed to by pI
254c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
254d0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
254e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
254f0 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f  pVfs,      /* Po
25500 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
25510 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20  ect */.  int h, 
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
25540 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
25550 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
25560 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 2c 20  .  int syncDir, 
25570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25580 75 65 20 74 6f 20 73 79 6e 63 20 64 69 72 65 63  ue to sync direc
25590 74 6f 72 79 20 6f 6e 20 66 69 72 73 74 20 73 79  tory on first sy
255a0 6e 63 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nc */.  sqlite3_
255b0 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
255c0 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
255d0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
255e0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
255f0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
25600 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
25610 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
25620 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  pened */.  int n
25630 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  oLock,          
25640 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69     /* Omit locki
25650 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ng if true */.  
25660 69 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20  int isDelete,   
25670 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
25680 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
25690 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65  ue */.  int isRe
256a0 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
256b0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66  /* True if the f
256c0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
256d0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20  ad-only */.){.  
256e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
256f0 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
25700 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
25710 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
25720 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
25730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25740 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
25750 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
25760 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65   );..  /* Parame
25770 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20  ter isDelete is 
25780 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77  only used on vxw
25790 6f 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68  orks. Express th
257a0 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20  is explicitly . 
257b0 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76   ** here to prev
257c0 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ent compiler war
257d0 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
257e0 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ed parameters.. 
257f0 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
25800 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29  AMETER(isDelete)
25810 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
25820 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
25830 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
25840 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
25850 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
25860 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
25870 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
25880 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
25890 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
258a0 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
258b0 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
258c0 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
258d0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
258e0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
258f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25900 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
25910 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
25920 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
25930 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
25940 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
25950 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
25960 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
25970 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
25980 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
25990 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
259a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
259b0 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
259c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
259d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
259e0 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 6e 6f 4c  lename!=0 || noL
259f0 6f 63 6b 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ock );..  OSTRAC
25a00 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
25a10 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
25a20 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
25a30 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 7a  h = h;.  pNew->z
25a40 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
25a50 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70  ;.  if( memcmp(p
25a60 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
25a70 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b  -excl",10)==0 ){
25a80 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
25a90 6c 61 67 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f  lags = UNIXFILE_
25aa0 45 58 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EXCL;.  }else{. 
25ab0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
25ac0 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  gs = 0;.  }.  if
25ad0 28 20 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a  ( isReadOnly ){.
25ae0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
25af0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
25b00 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  RDONLY;.  }.  if
25b10 28 20 73 79 6e 63 44 69 72 20 29 7b 0a 20 20 20  ( syncDir ){.   
25b20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
25b30 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52   |= UNIXFILE_DIR
25b40 53 59 4e 43 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  SYNC;.  }..#if O
25b50 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
25b60 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
25b70 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
25b80 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
25b90 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
25ba0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
25bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25bc0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
25bd0 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
25be0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
25bf0 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
25c00 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
25c10 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
25c20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
25c30 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
25c40 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
25c50 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
25c60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25c70 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
25c80 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
25c90 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
25ca0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
25cb0 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
25cc0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
25cd0 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
25ce0 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
25cf0 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
25d00 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
25d10 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
25d20 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
25d30 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
25d40 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
25d50 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
25d60 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
25d70 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
25d80 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
25d90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
25da0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
25db0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
25dc0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
25dd0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25de0 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
25df0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
25e00 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
25e10 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
25e20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
25e30 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
25e40 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
25e50 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
25e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25e70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25e80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
25e90 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
25ea0 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
25eb0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
25ec0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
25ed0 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
25ee0 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
25ef0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
25f00 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
25f10 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
25f20 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
25f30 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
25f40 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
25f50 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
25f60 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
25f70 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
25f80 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
25f90 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
25fa0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
25fb0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
25fc0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
25fd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
25fe0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
25ff0 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
26000 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
26010 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
26020 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
26030 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
26040 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
26050 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
26060 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
26070 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
26080 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
26090 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
260a0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
260b0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
260c0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
260d0 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
260e0 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
260f0 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
26100 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
26110 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
26120 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
26130 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
26140 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
26150 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
26160 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
26170 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
26180 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
26190 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
261a0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
261b0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
261c0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
261d0 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
261e0 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
261f0 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
26200 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
26210 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
26220 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
26230 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
26240 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
26250 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26260 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
26270 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
26280 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
26290 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
262a0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
262b0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
262c0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
262d0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
262e0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
262f0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
26300 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
26310 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
26320 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
26330 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
26340 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
26350 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
26360 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
26370 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
26380 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
26390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
263a0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
263b0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
263c0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
263d0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
263e0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
263f0 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
26400 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
26410 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
26420 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
26430 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
26440 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
26450 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
26460 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
26470 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
26480 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
26490 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
264a0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
264b0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
264c0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
264d0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
264e0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
264f0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
26500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26520 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
26530 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
26540 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
26550 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
26560 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
26570 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
26580 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
26590 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
265a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
265b0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
265c0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
265d0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
265e0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
265f0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
26600 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
26610 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
26620 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
26630 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
26640 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
26650 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
26660 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
26670 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
26680 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
26690 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
266a0 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
266b0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
266c0 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
266d0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
266e0 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
266f0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
26700 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
26710 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26720 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
26730 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26740 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
26750 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
26760 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
26770 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
26780 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
26790 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
267a0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
267b0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
267c0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
267d0 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
267e0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
267f0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
26800 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
26810 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
26820 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
26830 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
26840 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
26850 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
26860 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
26870 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
26880 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
26890 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
268a0 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
268b0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
268c0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
268d0 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
268e0 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
268f0 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
26900 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
26910 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
26920 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
26930 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
26940 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
26950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26960 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
26970 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
26980 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
26990 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
269a0 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
269b0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
269c0 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
269d0 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
269e0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
269f0 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
26a00 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
26a10 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
26a20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
26a30 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
26a40 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
26a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
26a60 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
26a70 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
26a80 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
26a90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
26aa0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
26ab0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
26ac0 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
26ad0 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
26ae0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
26af0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26b00 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
26b10 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
26b20 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
26b30 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
26b40 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
26b50 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20  .    isDelete = 
26b60 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69  0;.  }.  pNew->i
26b70 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c 65  sDelete = isDele
26b80 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  te;.#endif.  if(
26b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26ba0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
26bb0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
26bc0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
26bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
26be0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
26bf0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
26c00 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
26c10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26c20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
26c30 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
26c40 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
26c50 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
26c60 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
26c70 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
26c80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
26c90 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
26ca0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
26cb0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
26cc0 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
26cd0 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
26ce0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
26cf0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
26d00 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
26d10 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
26d20 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
26d30 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
26d40 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f  .     0        /
26d50 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
26d60 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  r */.  };.  unsi
26d70 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
26d80 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
26d90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
26da0 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73  r = 0;..  azDirs
26db0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
26dc0 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
26dd0 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
26de0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
26df0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
26e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
26e10 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
26e20 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
26e30 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
26e40 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
26e50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26e60 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
26e70 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
26e80 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
26e90 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
26ea0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
26eb0 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
26ec0 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
26ed0 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
26ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
26ef0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
26f00 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
26f10 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
26f20 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
26f30 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
26f40 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
26f50 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
26f60 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
26f70 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
26f80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
26f90 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
26fa0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
26fb0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
26fc0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
26fd0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
26fe0 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
26ff0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
27000 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
27010 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
27020 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
27030 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
27040 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
27050 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
27060 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
27070 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
27080 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
27090 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
270a0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
270b0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
270c0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
270d0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
270e0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
270f0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
27100 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
27110 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
27120 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
27130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27140 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
27150 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
27160 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
27170 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
27180 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
27190 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
271a0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
271b0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
271c0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
271d0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
271e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
271f0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
27200 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
27210 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
27220 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
27230 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65  ) + 17) >= (size
27240 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
27250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27260 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
27270 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27280 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
27290 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
272a0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
272b0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
272c0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
272d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
272e0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
272f0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
27300 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
27310 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
27320 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
27330 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
27340 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
27350 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
27360 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
27370 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
27380 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42  ile( osAccess(zB
27390 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
273a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
273b0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
273c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
273d0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
273e0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
273f0 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
27400 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
27410 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
27420 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
27430 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
27440 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
27450 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
27460 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
27470 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
27480 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
27490 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
274a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
274b0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
274c0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
274d0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
274e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
274f0 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
27500 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
27510 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
27520 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
27530 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
27540 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
27550 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
27560 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
27570 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
27580 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
27590 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
275a0 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
275b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
275c0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
275d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
275e0 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
275f0 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
27600 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
27610 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
27620 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
27630 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
27640 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27650 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
27660 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
27670 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
27680 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
27690 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
276a0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
276b0 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
276c0 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
276d0 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
276e0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
276f0 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
27700 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
27710 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
27720 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
27730 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
27740 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
27750 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
27760 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
27770 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
27780 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
27790 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
277a0 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
277b0 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
277c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
277d0 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
277e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
277f0 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
27800 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
27810 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
27820 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
27830 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
27840 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
27850 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
27860 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
27870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27880 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
27890 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
278a0 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
278b0 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
278c0 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
278d0 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
278e0 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
278f0 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
27900 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
27910 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
27920 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
27930 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
27940 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
27950 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
27960 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
27970 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
27980 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
27990 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
279a0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
279d0 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
279e0 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c   /* A stat() cal
279f0 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76  l may fail for v
27a00 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20  arious reasons. 
27a10 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
27a20 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f   it is.  ** almo
27a30 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
27a40 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f  an open() call o
27a50 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20  n the same path 
27a60 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a  will also fail..
27a70 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65    ** For this re
27a80 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f  ason, if an erro
27a90 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
27aa0 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65  stat() call here
27ab0 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e  , it is.  ** ign
27ac0 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72  ored and -1 is r
27ad0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
27ae0 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20  ler will try to 
27af0 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a  open a new file.
27b00 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
27b10 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
27b20 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75  , fail, and retu
27b30 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
27b40 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  QLite..  **.  **
27b50 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65   Even if a subse
27b60 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c  quent open() cal
27b70 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20  l does succeed, 
27b80 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73  the consequences
27b90 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61   of.  ** not sea
27ba0 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73  rching for a res
27bb0 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  usable file desc
27bc0 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64  riptor are not d
27bd0 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30  ire.  */.  if( 0
27be0 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
27bf0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75  &sStat) ){.    u
27c00 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
27c10 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45  node;..    unixE
27c20 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
27c30 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
27c40 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
27c50 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
27c60 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
27c70 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
27ca0 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74  Id.ino!=sStat.st
27cb0 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
27cc0 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
27cd0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
27ce0 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
27cf0 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
27d00 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
27d10 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
27d20 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
27d30 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
27d40 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
27d50 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
27d60 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
27d70 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
27d80 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
27d90 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
27da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27db0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
27dc0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  x();.  }.#endif 
27dd0 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
27de0 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
27df0 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
27e00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
27e10 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
27e20 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
27e30 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
27e40 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
27e50 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
27e60 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
27e70 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
27e80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27e90 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
27ea0 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
27eb0 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
27ec0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
27ed0 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
27ee0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
27ef0 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
27f00 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
27f10 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27f20 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
27f30 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
27f40 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
27f50 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
27f60 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  If the file bein
27f70 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65  g opened is a te
27f80 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74  mporary file, it
27f90 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74   is always creat
27fa0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f  ed with.** the o
27fb0 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73  ctal permissions
27fc0 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74   0600 (read/writ
27fd0 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e  able by owner on
27fe0 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ly). If the file
27ff0 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73  .** is a databas
28000 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72  e or master jour
28010 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20  nal file, it is 
28020 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65  created with the
28030 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
28040 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46   mask SQLITE_DEF
28050 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
28060 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  SIONS..**.** Fin
28070 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c  ally, if the fil
28080 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
28090 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
280a0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
280b0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
280c0 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
280d0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
280e0 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
280f0 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
28100 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
28110 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
28120 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
28130 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
28140 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
28150 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
28160 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
28170 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
28180 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
28190 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
281a0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
281b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
281c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
281d0 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
281e0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
281f0 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
28200 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
28210 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
28220 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
28230 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
28240 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
28250 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
28260 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
28270 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
28280 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
28290 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
282a0 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
282b0 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
282c0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282e0 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
282f0 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
28300 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
28310 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
28320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
28330 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
28340 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
28350 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
28360 74 20 2a 70 4d 6f 64 65 20 20 20 20 20 20 20 20  t *pMode        
28370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28380 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
28390 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
283a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
283b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
283c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
283d0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
283e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
283f0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
28400 53 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c 61  SIONS;.  if( fla
28410 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
28420 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
28430 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
28440 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
28450 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
28460 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28470 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
28480 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
284b0 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
284c0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
284d0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
284e0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
284f0 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
28500 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
28510 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
28520 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
28530 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
28540 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
28550 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
28560 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
28570 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
28580 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
28590 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
285a0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
285b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
285c0 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
285d0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
285e0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
285f0 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
28600 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
28610 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
28620 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
28630 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
28640 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
28650 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
28660 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
28670 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
28680 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
28690 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
286a0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
286b0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
286c0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
286d0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
286e0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
286f0 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
28700 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
28710 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
28720 20 6e 44 62 3e 30 20 26 26 20 21 73 71 6c 69 74   nDb>0 && !sqlit
28730 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
28740 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20  nDb]) ) nDb--;. 
28750 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
28760 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
28770 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28780 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77  _OK;.#else.    w
28790 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
287a0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61  !='-' ){.      a
287b0 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a  ssert( nDb>0 );.
287c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50        assert( zP
287d0 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29  ath[nDb]!='\n' )
287e0 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20  ;.      nDb--;. 
287f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
28800 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
28810 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
28820 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
28830 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
28840 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
28850 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
28860 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
28870 30 37 37 37 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  0777;.    }else{
28880 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
28890 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
288a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
288b0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
288c0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
288d0 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
288e0 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
288f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28900 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
28910 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
28920 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
28930 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
28940 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
28950 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
28960 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
28970 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
28980 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
28990 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
289a0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
289b0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
289c0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
289d0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
289e0 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
289f0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
28a00 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
28a10 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
28a20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
28a30 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
28a40 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
28a50 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
28a60 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
28a70 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
28a80 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
28a90 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
28aa0 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
28ab0 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
28ac0 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
28ad0 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
28ae0 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
28af0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
28b00 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
28b10 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
28b20 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
28b30 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
28b40 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
28b50 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
28b60 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
28b70 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
28b80 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
28b90 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
28ba0 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
28bb0 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
28bc0 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
28bd0 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
28be0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
28bf0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
28c00 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
28c10 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
28c20 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
28c30 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
28c40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
28c50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
28c60 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
28c70 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
28c80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
28c90 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
28ca0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
28cb0 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
28cc0 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
28cd0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
28ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28cf0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
28d00 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
28d10 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
28d20 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
28d30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
28d40 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
28d50 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
28d60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
28d70 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
28d80 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
28d90 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
28da0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
28db0 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
28dc0 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
28dd0 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
28de0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
28df0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
28e00 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
28e10 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
28e20 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
28e30 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
28e40 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
28e50 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
28e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28e70 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
28e80 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
28e90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28ea0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
28eb0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
28ec0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn Code */..  i
28ed0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
28ee0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28ef0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
28f00 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
28f10 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
28f20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
28f30 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
28f40 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
28f50 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28f60 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
28f70 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
28f80 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
28f90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
28fa0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
28fb0 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
28fc0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
28fd0 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
28fe0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28ff0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
29000 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
29010 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
29020 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
29030 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
29040 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
29050 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
29060 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
29070 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
29080 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Info;.#endif..  
29090 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
290a0 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
290b0 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
290c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
290d0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
290e0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
290f0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
29100 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
29110 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
29120 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
29130 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
29140 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
29150 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
29160 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
29170 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28   int syncDir = (
29180 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
29190 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
291a0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
291b0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
291c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
291d0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
291e0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
291f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29200 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
29210 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
29220 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
29230 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
29240 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
29250 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
29260 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
29270 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
29280 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
29290 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
292a0 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
292b0 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f  ATHNAME+1];.  co
292c0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
292d0 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
292e0 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
292f0 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
29300 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
29310 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
29320 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
29330 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
29340 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
29350 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
29360 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
29370 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
29380 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
29390 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
293a0 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
293b0 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
293c0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
293d0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
293e0 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
293f0 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
29400 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
29410 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
29420 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
29430 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
29440 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
29450 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
29460 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
29470 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
29480 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
29490 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
294a0 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
294b0 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
294c0 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
294d0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
294e0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
294f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
29500 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
29510 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
29520 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
29530 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
29540 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
29550 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
29560 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
29570 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29580 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29590 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
295a0 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
295b0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
295c0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
295d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
295e0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
295f0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
29600 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
29610 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
29620 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
29630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
29640 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
29650 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
29660 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
29670 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
29680 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
29690 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
296a0 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
296b0 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
296c0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
296d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
296e0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
296f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
29700 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
29710 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29720 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
29730 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29740 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
29750 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
29760 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
29770 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
29780 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
29790 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
297a0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
297b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
297c0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
297d0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
297e0 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65  N_WAL.  );..  me
297f0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
29800 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
29810 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
29820 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
29830 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65  ){.    UnixUnuse
29840 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20  dFd *pUnused;.  
29850 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
29860 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65  ReusableFd(zName
29870 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
29880 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
29890 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
298a0 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >fd;.    }else{.
298b0 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
298c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
298d0 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
298e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e  ;.      if( !pUn
298f0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
29900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29910 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
29920 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65   }.    p->pUnuse
29930 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d  d = pUnused;.  }
29940 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20  else if( !zName 
29950 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  ){.    /* If zNa
29960 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  me is NULL, the 
29970 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72  upper layer is r
29980 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70  equesting a temp
29990 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
299a0 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
299b0 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20   !syncDir);.    
299c0 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70  rc = unixGetTemp
299d0 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d  name(MAX_PATHNAM
299e0 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  E+1, zTmpname);.
299f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
29a10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29a20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
29a30 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
29a40 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
29a50 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
29a60 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
29a70 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
29a80 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
29a90 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
29aa0 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
29ab0 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
29ac0 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
29ad0 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
29ae0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
29af0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
29b00 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
29b10 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
29b20 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
29b30 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
29b40 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
29b50 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
29b60 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
29b70 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
29b80 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
29b90 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
29ba0 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
29bb0 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
29bc0 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
29bd0 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
29be0 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
29bf0 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
29c00 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
29c10 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69  |O_BINARY);..  i
29c20 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d  f( fd<0 ){.    m
29c30 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20  ode_t openMode; 
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c50 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63  Permissions to c
29c60 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20  reate file with 
29c70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  */.    rc = find
29c80 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
29c90 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
29ca0 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  enMode);.    if(
29cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29cc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29cd0 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20  !p->pUnused );. 
29ce0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
29cf0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
29d00 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
29d10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
29d20 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
29d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
29d40 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
29d50 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
29d60 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
29d70 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
29d80 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
29d90 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
29da0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
29db0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
29dc0 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
29dd0 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  & isReadWrite &&
29de0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
29df0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
29e00 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
29e10 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
29e20 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
29e30 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
29e40 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
29e50 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
29e60 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
29e70 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
29e80 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
29e90 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
29ea0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
29eb0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
29ec0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
29ed0 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
29ee0 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
29ef0 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20  = 1;.      fd = 
29f00 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
29f10 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
29f20 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  enMode);.    }. 
29f30 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
29f40 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
29f50 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
29f60 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
29f70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
29f80 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
29f90 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
29fa0 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
29fb0 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
29fc0 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
29fd0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
29fe0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e   }..  if( p->pUn
29ff0 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
2a000 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2a010 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
2a020 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
2a030 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
2a040 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
2a050 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
2a060 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20  = zName;.#else. 
2a070 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
2a080 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
2a090 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2a0a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2a0b0 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
2a0c0 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
2a0d0 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
2a0e0 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
2a0f0 45 43 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  EC.  osFcntl(fd,
2a100 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74   F_SETFD, osFcnt
2a110 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
2a120 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
2a130 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63  .#endif..  noLoc
2a140 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
2a150 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
2a160 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
2a170 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
2a180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2a190 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20  ING_STYLE.  if( 
2a1a0 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49  fstatfs(fd, &fsI
2a1b0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2a1c0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
2a1d0 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  ile)->lastErrno 
2a1e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62  = errno;.    rob
2a1f0 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2a200 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2a210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2a220 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
2a230 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
2a240 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
2a250 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2a260 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
2a270 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
2a280 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2a290 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
2a2a0 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  S;.  }.#endif.  
2a2b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2a2c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a2d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
2a2e0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2a2f0 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
2a300 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
2a310 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
2a320 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
2a330 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
2a340 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
2a350 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
2a360 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
2a370 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2a380 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
2a390 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
2a3a0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
2a3b0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2a3c0 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
2a3d0 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
2a3e0 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
2a3f0 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
2a400 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
2a410 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
2a420 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
2a430 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
2a440 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
2a450 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2a460 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
2a470 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2a480 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a      if( statfs(z
2a490 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
2a4a0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
2a4b0 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
2a4c0 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c  e close(fd) call
2a4d0 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e   is sub-optimal.
2a4e0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
2a4f0 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ned.        ** w
2a500 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61  ith fd is a data
2a510 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74  base file, and t
2a520 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63  here are other c
2a530 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a  onnections open.
2a540 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
2a550 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
2a560 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69   currently holdi
2a570 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ng advisory lock
2a580 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20  s on it,.       
2a590 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c   ** then the cal
2a5a0 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c  l to close() wil
2a5b0 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c  l cancel those l
2a5c0 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ocks. In practic
2a5d0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  e,.        ** we
2a5e0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61  're assuming tha
2a5f0 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e  t statfs() doesn
2a600 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74  't fail very oft
2a610 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20  en. At least.   
2a620 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c       ** not whil
2a630 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  e other file des
2a640 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
2a650 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
2a660 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ess on.        *
2a670 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  * the same file 
2a680 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f  are working.  */
2a690 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74  .        p->last
2a6a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
2a6b0 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
2a6c0 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
2a6d0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  E__);.        rc
2a6e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2a6f0 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20  ACCESS;.        
2a700 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2a710 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
2a720 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
2a730 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
2a740 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
2a750 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
2a760 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
2a770 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
2a780 66 73 2c 20 66 64 2c 20 73 79 6e 63 44 69 72 2c  fs, fd, syncDir,
2a790 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
2a7a0 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  oLock,.         
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65 61   isDelete, isRea
2a7d0 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 69 66  donly);.      if
2a7e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a7f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2a800 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2a810 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
2a820 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
2a830 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
2a840 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a850 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  .          /* Us
2a860 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63  e unixClose to c
2a870 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f  lean up the reso
2a880 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66  urces added in f
2a890 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20  illInUnixFile . 
2a8a0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2a8b0 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74  clear all the st
2a8c0 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65  ructure's refere
2a8d0 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61  nces.  Specifica
2a8e0 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  lly, .          
2a8f0 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  ** pFile->pMetho
2a900 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  ds will be NULL 
2a910 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  so sqlite3OsClos
2a920 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f  e will be a no-o
2a930 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  p .          */.
2a940 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c            unixCl
2a950 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
2a960 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2a970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a980 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
2a990 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2a9a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
2a9b0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
2a9c0 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
2a9d0 20 73 79 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c   syncDir, pFile,
2a9e0 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a   zPath, noLock,.
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20        isDelete, 
2aa10 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70 65  isReadonly);.ope
2aa20 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
2aa30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2aa40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2aa50 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b  ree(p->pUnused);
2aa60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2aa70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ;.}.../*.** Dele
2aa80 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a  te the file at z
2aa90 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
2aaa0 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
2aab0 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a   true, fsync().*
2aac0 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
2aad0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74  after deleting t
2aae0 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
2aaf0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74  ic int unixDelet
2ab00 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
2ab10 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
2ab20 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  * VFS containing
2ab30 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65   this as the xDe
2ab40 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lete method */. 
2ab50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2ab60 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  th,        /* Na
2ab70 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2ab80 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
2ab90 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20  t dirSync       
2aba0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2abb0 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65  ue, fsync() dire
2abc0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
2abd0 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  ting file */.){.
2abe0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2abf0 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50  E_OK;.  UNUSED_P
2ac00 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2ac10 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2ac20 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
2ac30 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
2ac40 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b  ;.  if( osUnlink
2ac50 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26  (zPath)==(-1) &&
2ac60 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29   errno!=ENOENT )
2ac70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  {.    return uni
2ac80 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2ac90 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22  _IOERR_DELETE, "
2aca0 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b  unlink", zPath);
2acb0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
2acc0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2acd0 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e  YNC.  if( dirSyn
2ace0 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  c ){.    int fd;
2acf0 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
2ad00 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
2ad10 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72   &fd);.    if( r
2ad20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ad30 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2ad40 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
2ad50 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20  d)==-1 ).#else. 
2ad60 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
2ad70 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  d) ).#endif.    
2ad80 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d    {.        rc =
2ad90 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2ada0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
2adb0 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a  SYNC, "fsync", z
2adc0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
2add0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
2ade0 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
2adf0 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  _);.    }else if
2ae00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2ae10 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
2ae20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ae30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2ae40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ae50 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
2ae60 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
2ae70 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
2ae80 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
2ae90 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
2aea0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
2aeb0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
2aec0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
2aed0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2aee0 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
2aef0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
2af00 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
2af10 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
2af20 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
2af30 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
2af40 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
2af50 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2af60 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
2af70 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
2af80 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
2af90 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
2afa0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
2afb0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
2afc0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2afd0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
2afe0 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
2aff0 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
2b000 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2b010 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2b020 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
2b030 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
2b040 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2b050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2b060 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
2b070 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
2b080 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
2b090 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
2b0a0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
2b0b0 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
2b0c0 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
2b0d0 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30  .  int amode = 0
2b0e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2b0f0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2b100 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2b110 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2b120 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
2b130 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
2b140 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
2b150 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2b160 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  S:.      amode =
2b170 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   F_OK;.      bre
2b180 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2b190 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2b1a0 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64  RITE:.      amod
2b1b0 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20  e = W_OK|R_OK;. 
2b1c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b1d0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2b1e0 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61  SS_READ:.      a
2b1f0 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20  mode = R_OK;.   
2b200 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
2b210 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
2b220 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
2b230 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
2b240 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
2b250 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74  = (osAccess(zPat
2b260 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
2b270 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
2b280 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2b290 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a   && *pResOut ){.
2b2a0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2b2b0 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  buf;.    if( 0==
2b2c0 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
2b2d0 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
2b2e0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
2b2f0 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
2b300 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2b310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2b320 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
2b330 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
2b340 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
2b350 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
2b360 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
2b370 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
2b380 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
2b390 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
2b3a0 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
2b3b0 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
2b3c0 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
2b3d0 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
2b3e0 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
2b3f0 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
2b400 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
2b410 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
2b420 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
2b430 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
2b440 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
2b450 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2b470 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
2b480 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2b490 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2b4a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2b4b0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
2b4c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2b4d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2b4e0 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
2b4f0 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
2b500 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b520 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
2b530 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
2b540 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
2b550 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b560 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
2b570 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
2b580 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2b590 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2b5a0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2b5b0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2b5c0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2b5d0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2b5e0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2b5f0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2b600 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2b610 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2b620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
2b630 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
2b640 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
2b650 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
2b660 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
2b670 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
2b680 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2b690 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b6a0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
2b6b0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
2b6c0 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
2b6d0 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
2b6e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b6f0 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
2b700 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
2b710 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
2b720 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
2b730 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
2b740 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
2b750 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
2b760 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
2b770 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
2b780 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
2b790 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
2b7a0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2b7b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
2b7c0 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
2b7d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
2b7e0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2b7f0 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
2b800 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
2b810 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
2b820 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
2b830 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2b840 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
2b850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b860 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
2b870 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
2b880 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
2b890 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
2b8a0 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
2b8b0 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
2b8c0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b8d0 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
2b8e0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b8f0 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
2b900 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
2b910 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
2b920 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2b930 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
2b940 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
2b950 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b960 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2b970 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
2b980 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
2b990 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
2b9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
2b9b0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
2b9c0 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
2b9d0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
2b9e0 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
2b9f0 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
2ba00 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
2ba10 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
2ba20 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
2ba30 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
2ba40 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
2ba50 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
2ba60 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
2ba70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
2ba80 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
2ba90 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
2baa0 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
2bab0 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
2bac0 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
2bad0 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
2bae0 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
2baf0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
2bb00 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2bb10 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
2bb20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2bb30 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
2bb40 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2bb50 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
2bb60 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
2bb70 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
2bb80 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
2bb90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2bba0 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
2bbb0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
2bbc0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2bbd0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2bbe0 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
2bbf0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2bc00 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
2bc10 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
2bc20 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
2bc30 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
2bc40 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
2bc50 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
2bc60 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
2bc70 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
2bc80 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
2bc90 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
2bca0 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
2bcb0 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
2bcc0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
2bcd0 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
2bce0 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
2bcf0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
2bd00 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
2bd10 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
2bd20 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
2bd30 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
2bd40 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
2bd50 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
2bd60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2bd70 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
2bd80 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
2bd90 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
2bda0 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
2bdb0 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2bdc0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
2bdd0 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
2bde0 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
2bdf0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
2be00 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
2be10 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
2be20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
2be30 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
2be40 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
2be50 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
2be60 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
2be70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2be80 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
2be90 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
2bea0 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
2beb0 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
2bec0 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
2bed0 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
2bee0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
2bef0 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
2bf00 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
2bf10 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
2bf20 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
2bf30 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
2bf40 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
2bf50 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
2bf60 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
2bf70 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
2bf80 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
2bf90 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2bfa0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2bfb0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2bfc0 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
2bfd0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2bfe0 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
2bff0 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
2c000 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
2c010 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
2c020 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
2c030 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
2c040 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
2c050 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2c060 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
2c070 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
2c080 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
2c090 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2c0a0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
2c0b0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
2c0c0 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
2c0d0 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
2c0e0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2c0f0 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
2c100 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
2c110 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2c120 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
2c130 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
2c140 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
2c150 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
2c160 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2c170 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
2c180 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2c190 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2c1a0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
2c1b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c1c0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
2c1d0 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
2c1e0 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
2c1f0 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
2c200 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
2c210 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
2c220 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
2c230 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
2c240 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
2c250 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
2c260 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
2c270 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
2c280 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
2c290 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
2c2a0 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
2c2b0 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
2c2c0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
2c2d0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
2c2e0 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
2c2f0 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
2c300 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
2c310 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
2c320 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
2c330 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
2c340 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
2c350 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
2c360 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
2c370 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
2c380 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
2c390 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
2c3a0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
2c3b0 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
2c3c0 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
2c3d0 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
2c3e0 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
2c3f0 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
2c400 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
2c410 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
2c420 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
2c430 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
2c440 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
2c450 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
2c460 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
2c470 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
2c480 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
2c490 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2c4a0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
2c4b0 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 72  , fd;.    fd = r
2c4c0 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
2c4d0 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
2c4e0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
2c4f0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
2c500 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
2c510 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
2c520 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
2c530 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
2c540 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
2c550 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
2c560 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
2c570 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
2c580 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
2c590 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
2c5a0 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
2c5b0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
2c5c0 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
2c5d0 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
2c5e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c5f0 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65   do{ nBuf = osRe
2c600 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
2c610 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66  f); }while( nBuf
2c620 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
2c630 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
2c640 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
2c650 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2c660 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2c670 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
2c680 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
2c690 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
2c6a0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
2c6b0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
2c6c0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
2c6d0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2c6e0 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
2c6f0 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
2c700 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2c710 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
2c720 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2c730 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
2c740 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
2c750 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
2c760 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
2c770 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
2c780 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
2c790 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2c7a0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2c7b0 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
2c7c0 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
2c7d0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
2c7e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2c7f0 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
2c800 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
2c810 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
2c820 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
2c830 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
2c840 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
2c850 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
2c860 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
2c870 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
2c880 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
2c890 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
2c8a0 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
2c8b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c8c0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2c8d0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
2c8e0 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
2c8f0 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
2c900 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
2c910 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
2c920 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
2c930 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c940 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
2c950 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
2c960 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
2c970 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
2c980 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
2c990 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
2c9a0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c9b0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c9c0 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
2c9d0 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
2c9e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2c9f0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
2ca00 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
2ca10 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
2ca20 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
2ca30 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
2ca40 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2ca50 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
2ca60 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
2ca70 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
2ca80 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
2ca90 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
2caa0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2cab0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
2cac0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
2cad0 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
2cae0 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
2caf0 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
2cb00 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2cb10 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2cb20 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2cb30 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2cb40 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
2cb50 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
2cb60 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2cb70 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2cb80 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
2cb90 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
2cba0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
2cbb0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
2cbc0 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
2cbd0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2cbe0 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
2cbf0 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
2cc00 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
2cc10 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
2cc20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
2cc30 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
2cc40 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
2cc50 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
2cc60 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
2cc70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
2cc80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
2cc90 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
2cca0 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
2ccb0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2ccc0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2ccd0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2cce0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2ccf0 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
2cd00 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
2cd10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2cd20 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
2cd30 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
2cd40 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
2cd50 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63  640000;.  int rc
2cd60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69   = SQLITE_OK;.#i
2cd70 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
2cd80 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
2cd90 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
2cda0 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65  piNow = ((sqlite
2cdb0 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20  3_int64)t)*1000 
2cdc0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c  + unixEpoch;.#el
2cdd0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2cde0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2cdf0 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65  sNow;.  clock_ge
2ce00 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c  ttime(CLOCK_REAL
2ce10 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20  TIME, &sNow);.  
2ce20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
2ce30 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
2ce40 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
2ce50 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  _sec + sNow.tv_n
2ce60 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c  sec/1000000;.#el
2ce70 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
2ce80 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20  val sNow;.  if( 
2ce90 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
2cea0 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ow, 0)==0 ){.   
2ceb0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
2cec0 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
2ced0 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
2cee0 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
2cef0 75 73 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c  usec/1000;.  }el
2cf00 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
2cf10 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
2cf20 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
2cf30 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
2cf40 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2cf50 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
2cf60 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
2cf70 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
2cf80 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
2cf90 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
2cfa0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
2cfb0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2cfc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2cfd0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
2cfe0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
2cff0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
2d000 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
2d010 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
2d020 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2d030 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2d040 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
2d050 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
2d060 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
2d070 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
2d080 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
2d090 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2d0a0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
2d0b0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
2d0c0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
2d0d0 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71  le *prNow){.  sq
2d0e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
2d0f0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55  0;.  int rc;.  U
2d100 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2d110 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d  NotUsed);.  rc =
2d120 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2d130 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
2d140 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
2d150 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
2d160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  rc;.}../*.** We 
2d170 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
2d180 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
2d190 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
2d1a0 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
2d1b0 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
2d1c0 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
2d1d0 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
2d1e0 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
2d1f0 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
2d200 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
2d210 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
2d220 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
2d230 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
2d240 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
2d250 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
2d260 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
2d270 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
2d280 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
2d290 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
2d2a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d2b0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
2d2c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2d2d0 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
2d2e0 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
2d2f0 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
2d300 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2d310 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d320 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
2d330 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d340 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
2d350 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
2d360 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
2d380 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
2d390 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
2d3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d400 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
2d410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d450 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2d460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
2d470 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
2d480 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
2d490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d4a0 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
2d4b0 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
2d4c0 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
2d4d0 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
2d4e0 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
2d4f0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
2d500 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
2d510 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
2d520 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2d530 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
2d540 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
2d550 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
2d560 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
2d570 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
2d580 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
2d590 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
2d5a0 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
2d5b0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
2d5c0 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
2d5d0 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
2d5e0 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
2d5f0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
2d600 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
2d610 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
2d620 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
2d630 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
2d640 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
2d650 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
2d660 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
2d670 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2d680 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
2d690 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
2d6a0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
2d6b0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
2d6c0 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
2d6d0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
2d6e0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
2d6f0 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
2d700 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
2d710 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
2d720 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
2d730 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
2d740 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
2d750 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
2d760 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
2d770 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
2d780 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
2d790 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
2d7a0 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
2d7b0 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
2d7c0 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
2d7d0 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
2d7e0 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
2d7f0 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
2d800 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
2d810 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
2d820 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
2d830 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
2d840 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
2d850 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
2d860 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
2d870 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
2d880 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
2d890 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
2d8a0 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
2d8b0 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
2d8c0 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
2d8d0 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
2d8e0 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
2d8f0 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
2d900 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
2d910 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
2d920 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
2d930 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
2d940 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
2d950 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2d960 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
2d970 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
2d980 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20     0x40000000.. 
2d990 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45    ..**      RESE
2d9a0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
2d9b0 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
2d9c0 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
2d9d0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
2d9e0 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
2d9f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
2da00 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
2da10 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
2da20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
2da30 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
2da40 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
2da50 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
2da60 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
2da70 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
2da80 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
2da90 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
2daa0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
2dab0 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
2dac0 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
2dad0 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
2dae0 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
2daf0 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
2db00 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
2db10 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
2db20 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
2db30 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
2db40 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
2db50 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
2db60 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
2db70 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
2db80 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
2db90 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
2dba0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
2dbb0 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
2dbc0 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
2dbd0 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
2dbe0 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
2dbf0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
2dc00 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
2dc10 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
2dc20 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
2dc30 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
2dc40 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
2dc50 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
2dc60 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
2dc70 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
2dc80 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
2dc90 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
2dca0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
2dcb0 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
2dcc0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
2dcd0 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
2dce0 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
2dcf0 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
2dd00 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
2dd10 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
2dd20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
2dd30 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
2dd40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2dd50 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
2dd60 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
2dd70 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
2dd80 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
2dd90 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
2dda0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
2ddb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
2ddc0 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
2ddd0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2dde0 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
2ddf0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
2de00 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
2de30 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
2de40 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
2de50 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
2de60 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
2de70 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
2de80 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
2de90 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
2dea0 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
2deb0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
2dec0 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
2ded0 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
2dee0 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
2def0 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
2df00 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
2df10 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
2df20 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
2df30 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
2df40 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
2df50 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
2df60 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
2df70 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
2df80 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
2df90 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
2dfa0 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
2dfb0 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
2dfc0 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
2dfd0 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
2dfe0 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2dff0 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
2e000 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
2e010 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
2e020 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
2e030 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
2e040 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
2e050 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
2e060 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
2e070 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
2e080 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
2e090 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
2e0a0 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
2e0b0 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
2e0c0 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
2e0d0 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
2e0e0 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
2e0f0 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
2e100 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
2e110 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
2e120 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2e130 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
2e140 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
2e150 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
2e160 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
2e170 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
2e180 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
2e190 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
2e1a0 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
2e1b0 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
2e1c0 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
2e1d0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
2e1e0 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
2e1f0 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
2e200 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
2e210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e220 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
2e230 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
2e240 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
2e250 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
2e260 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
2e270 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
2e280 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
2e290 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
2e2a0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
2e2b0 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
2e2c0 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
2e2d0 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
2e2e0 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
2e2f0 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
2e300 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
2e310 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
2e320 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
2e330 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
2e340 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
2e350 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
2e360 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
2e370 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
2e380 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
2e390 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
2e3a0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
2e3b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
2e3c0 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
2e3d0 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
2e3e0 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
2e3f0 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
2e400 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
2e410 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
2e420 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
2e430 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
2e440 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
2e450 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
2e460 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
2e470 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
2e480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e490 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
2e4a0 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
2e4b0 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
2e4c0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2e4d0 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
2e4e0 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
2e4f0 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
2e500 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
2e510 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
2e520 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
2e530 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
2e540 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
2e550 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
2e560 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
2e570 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
2e580 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
2e590 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
2e5a0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2e5b0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
2e5c0 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
2e5d0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
2e5e0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
2e5f0 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
2e600 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
2e610 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
2e620 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
2e630 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
2e640 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
2e650 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
2e660 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
2e670 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
2e680 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
2e690 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
2e6a0 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
2e6b0 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
2e6c0 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
2e6d0 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
2e6e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e6f0 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
2e700 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
2e710 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
2e720 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
2e730 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
2e740 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
2e750 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
2e760 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
2e770 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
2e780 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
2e790 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
2e7a0 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
2e7b0 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
2e7c0 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
2e7d0 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
2e7e0 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
2e7f0 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
2e800 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
2e810 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
2e820 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
2e830 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
2e840 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
2e850 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
2e860 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
2e870 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
2e880 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
2e890 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
2e8a0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
2e8b0 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
2e8c0 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
2e8d0 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
2e8e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e8f0 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
2e900 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
2e910 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
2e920 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
2e930 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
2e940 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
2e950 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
2e960 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
2e970 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
2e980 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
2e990 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
2e9a0 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
2e9b0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
2e9c0 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
2e9d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e9e0 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
2e9f0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2ea00 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
2ea10 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
2ea20 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
2ea30 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
2ea40 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
2ea50 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
2ea60 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
2ea70 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
2ea80 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
2ea90 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
2eaa0 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
2eab0 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
2eac0 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
2ead0 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
2eae0 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
2eaf0 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
2eb00 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
2eb10 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
2eb20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
2eb30 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
2eb40 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
2eb50 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
2eb60 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
2eb70 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
2eb80 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
2eb90 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
2eba0 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
2ebb0 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
2ebc0 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
2ebd0 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
2ebe0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
2ebf0 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
2ec00 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
2ec10 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
2ec20 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
2ec30 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
2ec40 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
2ec50 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
2ec60 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
2ec70 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
2ec80 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
2ec90 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
2eca0 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
2ecb0 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
2ecc0 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
2ecd0 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
2ece0 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
2ecf0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
2ed00 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2ed10 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
2ed20 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
2ed30 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
2ed40 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2ed50 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
2ed60 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
2ed70 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
2ed80 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
2ed90 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
2eda0 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
2edb0 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
2edc0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
2edd0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
2ede0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
2edf0 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
2ee00 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
2ee10 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
2ee20 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
2ee30 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
2ee40 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
2ee50 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
2ee60 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2ee70 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
2ee80 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
2ee90 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
2eea0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
2eeb0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2eec0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2eed0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2eee0 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
2eef0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2ef00 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
2ef10 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
2ef20 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
2ef30 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
2ef40 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
2ef50 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
2ef60 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
2ef70 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
2ef80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
2ef90 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
2efa0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
2efb0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2efc0 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
2efd0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
2efe0 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
2eff0 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
2f000 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2f010 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
2f020 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
2f030 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
2f040 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
2f050 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2f060 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
2f070 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2f080 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
2f090 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2f0a0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
2f0b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2f0c0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
2f0d0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
2f0e0 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
2f0f0 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
2f100 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
2f110 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
2f120 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
2f130 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
2f140 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
2f150 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
2f160 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
2f170 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
2f180 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
2f190 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
2f1a0 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
2f1b0 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
2f1c0 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
2f1d0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
2f1e0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
2f1f0 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
2f200 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2f210 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
2f220 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
2f230 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
2f240 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
2f250 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
2f260 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
2f270 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
2f280 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
2f290 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
2f2a0 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
2f2b0 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
2f2c0 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
2f2d0 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
2f2e0 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
2f2f0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
2f300 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
2f310 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
2f320 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
2f330 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
2f340 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2f350 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
2f360 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
2f370 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
2f380 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
2f390 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
2f3a0 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
2f3b0 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
2f3c0 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
2f3e0 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
2f3f0 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
2f400 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2f410 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
2f420 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
2f430 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
2f440 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
2f450 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
2f460 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
2f470 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
2f480 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
2f490 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
2f4a0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
2f4b0 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
2f4c0 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
2f4d0 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
2f4e0 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
2f4f0 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
2f500 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
2f510 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
2f520 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
2f530 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
2f540 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
2f550 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
2f560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
2f570 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
2f580 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
2f590 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
2f5a0 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
2f5b0 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
2f5c0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
2f5d0 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
2f5e0 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
2f5f0 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
2f600 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
2f610 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
2f620 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
2f630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f640 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
2f650 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
2f660 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
2f670 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
2f680 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
2f690 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2f6a0 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
2f6b0 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
2f6c0 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
2f6d0 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
2f6e0 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
2f6f0 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
2f700 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
2f710 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
2f720 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
2f730 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
2f740 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
2f750 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2f760 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
2f770 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
2f780 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
2f790 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
2f7a0 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
2f7b0 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
2f7c0 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
2f7d0 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
2f7e0 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
2f7f0 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
2f800 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
2f810 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
2f820 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
2f830 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
2f840 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2f850 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
2f860 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
2f870 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f880 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
2f890 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
2f8a0 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
2f8b0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  ';.        if( o
2f8c0 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49  sMkdir(buf, SQLI
2f8d0 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
2f8e0 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
2f8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2f900 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
2f910 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
2f920 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
2f930 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
2f940 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
2f950 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
2f960 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
2f970 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
2f980 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
2f990 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9b0 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
2f9c0 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
2f9d0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
2f9e0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2f9f0 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
2fa00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2fa10 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
2fa20 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
2fa30 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
2fa40 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
2fa50 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
2fa60 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
2fa70 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2fa80 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  n", lockPath, ge
2fa90 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
2faa0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2fab0 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
2fac0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2fad0 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
2fae0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
2faf0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
2fb00 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
2fb10 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
2fb20 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
2fb30 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
2fb40 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
2fb50 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
2fb60 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
2fb70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2fb80 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
2fb90 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
2fba0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
2fbb0 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
2fbc0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
2fbd0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
2fbe0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
2fbf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
2fc00 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
2fc10 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
2fc20 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
2fc30 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
2fc40 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
2fc50 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
2fc60 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
2fc70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
2fc80 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
2fc90 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
2fca0 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
2fcb0 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
2fcc0 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
2fcd0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2fce0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
2fcf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2fd00 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
2fd10 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
2fd20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
2fd30 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
2fd40 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
2fd50 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2fd60 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
2fd70 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
2fd80 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
2fd90 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
2fda0 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
2fdb0 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
2fdc0 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
2fdd0 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
2fde0 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
2fdf0 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
2fe00 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
2fe10 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
2fe20 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
2fe30 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
2fe40 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
2fe50 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
2fe60 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
2fe70 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
2fe80 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
2fe90 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
2fea0 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
2feb0 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
2fec0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2fed0 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
2fee0 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
2fef0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
2ff00 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
2ff10 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
2ff20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
2ff30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2ff40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ff50 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
2ff60 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62   ){.    fd = rob
2ff70 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
2ff80 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
2ff90 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2ffa0 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
2ffb0 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
2ffc0 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
2ffd0 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26  errno==ENOENT &&
2ffe0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
2fff0 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72       if( proxyCr
30000 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74  eateLockPath(pat
30010 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  h) == SQLITE_OK 
30020 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20  ){.        fd = 
30030 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
30040 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
30050 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
30060 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
30070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30080 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
30090 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
300a0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20  _RDONLY;.    fd 
300b0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
300c0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
300d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
300e0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
300f0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
30100 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
30110 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
30120 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
30130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30140 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
30150 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
30160 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
30170 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
30180 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
30190 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
301a0 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
301b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
301c0 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
301d0 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
301e0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
301f0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
30200 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
30210 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
30220 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
30230 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
30240 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
30250 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
30260 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
30270 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30280 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
30290 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
302a0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
302b0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
302c0 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65  nixFile));.  pNe
302d0 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  w->openFlags = o
302e0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73  penFlags;.  mems
302f0 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c  et(&dummyVfs, 0,
30300 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73   sizeof(dummyVfs
30310 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  ));.  dummyVfs.p
30320 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
30330 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
30340 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a  er;.  dummyVfs.z
30350 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a  Name = "dummy";.
30360 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
30370 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
30380 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
30390 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
303a0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
303b0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
303c0 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
303d0 20 66 64 2c 20 30 2c 20 28 73 71 6c 69 74 65 33   fd, 0, (sqlite3
303e0 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
303f0 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  h, 0, 0, 0);.  i
30400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30410 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20   ){.    *ppFile 
30420 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75  = pNew;.    retu
30430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30440 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  }.end_create_pro
30450 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74  xy:    .  robust
30460 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c  _close(pNew, fd,
30470 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71   __LINE__);.  sq
30480 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
30490 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
304a0 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74  (pUnused);.  ret
304b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
304c0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
304d0 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
304e0 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
304f0 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
30500 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
30510 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73  .int sqlite3_hos
30520 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e  tid_num = 0;.#en
30530 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f  dif..#define PRO
30540 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20  XY_HOSTIDLEN    
30550 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  16  /* conch fil
30560 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68  e host id length
30570 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61   */../* Not alwa
30580 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ys defined in th
30590 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74 20  e headers as it 
305a0 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65  ought to be */.e
305b0 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73  xtern int gethos
305c0 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c  tuuid(uuid_t id,
305d0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69   const struct ti
305e0 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a  mespec *wait);..
305f0 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20  /* get the host 
30600 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75  ID via gethostuu
30610 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75  id(), pHostID mu
30620 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58  st point to PROX
30630 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20  Y_HOSTIDLEN .** 
30640 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c  bytes of writabl
30650 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
30660 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
30670 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20  HostID(unsigned 
30680 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69  char *pHostID, i
30690 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61  nt *pError){.  a
306a0 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54  ssert(PROXY_HOST
306b0 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28  IDLEN == sizeof(
306c0 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73  uuid_t));.  mems
306d0 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50  et(pHostID, 0, P
306e0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
306f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d  .#if defined(__M
30700 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f  AX_OS_X_VERSION_
30710 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a 20  MIN_REQUIRED)\. 
30720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
30730 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53   __MAC_OS_X_VERS
30740 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
30750 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73 74  <1050.  {.    st
30760 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
30770 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f  t timespec timeo
30780 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20  ut = {1, 0}; /* 
30790 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f  1 sec timeout */
307a0 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74  .    if( gethost
307b0 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74  uuid(pHostID, &t
307c0 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20  imeout) ){.     
307d0 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
307e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72  ;.      if( pErr
307f0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  or ){.        *p
30800 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20  Error = err;.   
30810 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
30820 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
30830 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
30840 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30850 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64  ER(pError);.#end
30860 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
30870 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c  _TEST.  /* simul
30880 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
30890 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
308a0 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
308b0 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28  e paths */.  if(
308c0 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
308d0 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70  num != 0){.    p
308e0 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61  HostID[0] = (cha
308f0 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20  r)(pHostID[0] + 
30900 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68  (char)(sqlite3_h
30910 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46  ostid_num & 0xFF
30920 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
30930 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
30940 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  E_OK;.}../* The 
30950 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61  conch file conta
30960 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20  ins the header, 
30970 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b  host id and lock
30980 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23   file path. */.#
30990 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e  define PROXY_CON
309a0 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a  CHVERSION 2   /*
309b0 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20   1-byte header, 
309c0 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c  16-byte host id,
309d0 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65   path */.#define
309e0 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e   PROXY_HEADERLEN
309f0 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68      1   /* conch
30a00 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e   file header len
30a10 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  gth */.#define P
30a20 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20  ROXY_PATHINDEX  
30a30 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
30a40 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
30a50 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  EN).#define PROX
30a60 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28  Y_MAXCONCHLEN  (
30a70 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
30a80 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b  PROXY_HOSTIDLEN+
30a90 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20  MAXPATHLEN)../* 
30aa0 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65  .** Takes an ope
30ab0 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f  n conch file, co
30ac0 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  pies the content
30ad0 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20  s to a new path 
30ae0 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a  and then moves .
30af0 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65  ** it back.  The
30b00 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66   newly created f
30b10 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72  ile's file descr
30b20 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65  iptor is assigne
30b30 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63  d to the.** conc
30b40 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  h file structure
30b50 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65   and finally the
30b60 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20   original conch 
30b70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
30b80 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20  is .** closed.  
30b90 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  Returns zero if 
30ba0 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73  successful..*/.s
30bb0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42  tatic int proxyB
30bc0 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  reakConchLock(un
30bd0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
30be0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b  uid_t myHostID){
30bf0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
30c00 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
30c10 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
30c20 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
30c30 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
30c40 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
30c50 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
30c60 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50  hFile;.  char tP
30c70 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
30c80 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58  .  char buf[PROX
30c90 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
30ca0 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20    char *cPath = 
30cb0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
30cc0 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65  ath;.  size_t re
30cd0 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a  adLen = 0;.  siz
30ce0 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b  e_t pathLen = 0;
30cf0 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36  .  char errmsg[6
30d00 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66  4] = "";.  int f
30d10 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  d = -1;.  int rc
30d20 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f   = -1;.  UNUSED_
30d30 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74  PARAMETER(myHost
30d40 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74  ID);..  /* creat
30d50 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20  e a new path by 
30d60 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69  replace the trai
30d70 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69  ling '-conch' wi
30d80 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20  th '-break' */. 
30d90 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63   pathLen = strlc
30da0 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c  py(tPath, cPath,
30db0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
30dc0 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50  if( pathLen>MAXP
30dd0 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65  ATHLEN || pathLe
30de0 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74  n<6 || .     (st
30df0 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74  rlcpy(&tPath[pat
30e00 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22  hLen-5], "break"
30e10 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20  , 6) != 5) ){.  
30e20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30e30 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
30e40 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65  ),errmsg,"path e
30e50 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
30e60 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20  int)pathLen);.  
30e70 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
30e80 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72  lock;.  }.  /* r
30e90 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f  ead the conch co
30ea0 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c  ntent */.  readL
30eb0 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
30ec0 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20  chFile->h, buf, 
30ed0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
30ee0 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61  N, 0);.  if( rea
30ef0 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49  dLen<PROXY_PATHI
30f00 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69  NDEX ){.    sqli
30f10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30f20 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
30f30 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28  sg,"read error (
30f40 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65  len %d)",(int)re
30f50 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  adLen);.    goto
30f60 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
30f70 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69    }.  /* write i
30f80 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d  t out to the tem
30f90 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c  porary break fil
30fa0 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75  e */.  fd = robu
30fb0 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28  st_open(tPath, (
30fc0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f  O_RDWR|O_CREAT|O
30fd0 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20 20  _EXCL),.        
30fe0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
30ff0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
31000 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
31010 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
31020 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31030 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
31040 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
31050 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
31060 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
31070 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
31080 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
31090 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
310a0 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
310b0 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
310c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
310d0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
310e0 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
310f0 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
31100 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
31110 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
31120 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
31130 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
31140 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
31150 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
31160 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
31170 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
31180 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
31190 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
311a0 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
311b0 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
311c0 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
311d0 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
311e0 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
311f0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
31200 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
31210 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
31220 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
31230 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
31240 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
31250 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
31260 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
31270 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
31280 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
31290 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
312a0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
312b0 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
312c0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
312d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
312e0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
312f0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
31300 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
31310 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
31320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
31330 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
31340 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
31350 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
31360 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
31370 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
31380 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
31390 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
313a0 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
313b0 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
313c0 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
313d0 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
313e0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
313f0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
31400 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
31410 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
31420 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
31430 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
31440 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
31450 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
31460 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
31470 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
31480 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
31490 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
314a0 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
314b0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
314c0 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
314d0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
314e0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
314f0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
31500 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
31510 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
31520 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
31530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
31540 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
31550 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
31560 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
31570 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
31580 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
31590 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
315a0 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
315b0 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
315c0 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
315d0 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
315e0 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
315f0 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
31600 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
31610 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
31620 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
31630 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
31640 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
31650 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
31660 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
31670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
31680 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
31690 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
316a0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
316b0 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uf) ){.        p
316c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
316d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
316e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
316f0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
31700 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
31710 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b  if( nTries==1 ){
31720 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f  .        conchMo
31730 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d  dTime = buf.st_m
31740 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20  timespec;.      
31750 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29    usleep(500000)
31760 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65  ; /* wait 0.5 se
31770 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
31780 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20  ck again*/.     
31790 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
317a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
317b0 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29  sert( nTries>1 )
317c0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63  ;.      if( conc
317d0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20  hModTime.tv_sec 
317e0 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
317f0 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20  pec.tv_sec || . 
31800 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
31810 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20  Time.tv_nsec != 
31820 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
31830 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20  .tv_nsec ){.    
31840 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31850 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a  E_BUSY;.      }.
31860 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
31870 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a   nTries==2 ){  .
31880 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75          char tBu
31890 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
318a0 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
318b0 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  t len = osPread(
318c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
318d0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
318e0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
318f0 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
31900 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
31910 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
31920 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  no;.          re
31930 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
31940 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
31950 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
31960 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
31970 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
31980 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
31990 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
319a0 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
319b0 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
319c0 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
319d0 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
319e0 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
319f0 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
31a00 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
31a10 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
31a20 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
31a30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31a40 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
31a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
31a60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
31a70 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
31a80 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
31a90 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
31aa0 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
31ab0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
31ac0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
31ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
31ae0 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
31af0 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
31b00 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
31b10 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
31b20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
31b30 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
31b40 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
31b50 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
31b60 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
31b70 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
31b80 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
31b90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
31ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
31bb0 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
31bc0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
31bd0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
31be0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
31bf0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
31c00 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
31c10 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20  RED_LOCK);      
31c20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20      .        }. 
31c30 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
31c40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31c50 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
31c60 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
31c70 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31c80 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
31c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31ca0 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
31cb0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
31cc0 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
31cd0 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
31ce0 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68  ;.}../* Takes th
31cf0 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e  e conch by takin
31d00 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  g a shared lock 
31d10 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e  and read the con
31d20 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20  tents conch, if 
31d30 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20  .** lockPath is 
31d40 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f  non-NULL, the ho
31d50 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66  st ID and lock f
31d60 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61  ile path must ma
31d70 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a  tch.  A NULL .**
31d80 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20   lockPath means 
31d90 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74  that the lockPat
31da0 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
31db0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
31dc0 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
31dd0 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61   IDs match, or a
31de0 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77   new lock path w
31df0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
31e00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
31e10 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ** and written t
31e20 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  o the conch file
31e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31e40 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75  proxyTakeConch(u
31e50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
31e60 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
31e70 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
31e80 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31e90 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
31ea0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
31eb0 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
31ec0 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20  chHeld!=0 ){.   
31ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31ee0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
31ef0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
31f00 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
31f10 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f  hFile;.    uuid_
31f20 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20  t myHostID;.    
31f30 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
31f40 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66      char readBuf
31f50 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
31f60 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
31f70 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
31f80 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65  N];.    char *te
31f90 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  mpLockPath = NUL
31fa0 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
31fb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
31fc0 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d  nt createConch =
31fd0 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74   0;.    int host
31fe0 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  IdMatch = 0;.   
31ff0 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30   int readLen = 0
32000 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64  ;.    int tryOld
32010 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
32020 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f    int forceNewLo
32030 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
32040 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
32050 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  AKECONCH  %d for
32060 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
32070 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
32080 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
32090 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
320a0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
320b0 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
320c0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
320d0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74     rc = proxyGet
320e0 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c  HostID(myHostID,
320f0 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69   &pError);.    i
32100 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
32110 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
32120 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
32130 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20  rrno = pError;. 
32140 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32150 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
32160 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e     rc = proxyCon
32170 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
32180 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c  HostID, SHARED_L
32190 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
321a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
321b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
321c0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20  keconch;.    }. 
321d0 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65     /* read the e
321e0 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69  xisting conch fi
321f0 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65  le */.    readLe
32200 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  n = seekAndRead(
32210 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68  (unixFile*)conch
32220 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66  File, 0, readBuf
32230 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
32240 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65  LEN);.    if( re
32250 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  adLen<0 ){.     
32260 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c   /* I/O error: l
32270 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
32280 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
32290 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
322a0 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c  Errno = conchFil
322b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
322c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
322d0 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20  IOERR_READ;.    
322e0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
322f0 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20  onch;.    }else 
32300 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52  if( readLen<=(PR
32310 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
32320 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c  OXY_HOSTIDLEN) |
32330 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
32340 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61  readBuf[0]!=(cha
32350 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
32360 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  SION ){.      /*
32370 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72   a short read or
32380 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20   version format 
32390 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77  mismatch means w
323a0 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
323b0 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a   a new .      **
323c0 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20   conch file. .  
323d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65      */.      cre
323e0 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20  ateConch = 1;.  
323f0 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68    }.    /* if th
32400 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
32410 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70  s and the lock p
32420 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69 73  ath already exis
32430 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a  ts in the conch.
32440 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79      ** we'll try
32450 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74 68   to use the path
32460 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63 61   there, if we ca
32470 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61  n't open that pa
32480 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a  th, we'll .    *
32490 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20 6e  * retry with a n
324a0 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  ew auto-generate
324b0 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20  d path .    */. 
324c0 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61     do { /* in ca
324d0 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72  se we need to tr
324e0 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a  y again for an :
324f0 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b  auto: named lock
32500 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
32510 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68  if( !createConch
32520 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63   && !forceNewLoc
32530 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
32540 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21   hostIdMatch = !
32550 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b  memcmp(&readBuf[
32560 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
32570 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20  , myHostID, .   
32580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
325a0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
325b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74  .        /* if t
325c0 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74  he conch has dat
325d0 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  a compare the co
325e0 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntents */.      
325f0 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
32600 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
32610 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61          /* for a
32620 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20  uto-named local 
32630 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20  lock file, just 
32640 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49  check the host I
32650 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20  D and we'll.    
32660 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68         ** use th
32670 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
32680 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61 6c  e path that's al
32690 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20  ready in there. 
326a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
326b0 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49         if( hostI
326c0 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  dMatch ){.      
326d0 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74        size_t pat
326e0 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20  hLen = (readLen 
326f0 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  - PROXY_PATHINDE
32700 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  X);.            
32710 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
32720 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54   pathLen>=MAXPAT
32730 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  HLEN ){.        
32740 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41        pathLen=MA
32750 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20  XPATHLEN-1;.    
32760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32770 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63        memcpy(loc
32780 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  kPath, &readBuf[
32790 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
327a0 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  , pathLen);.    
327b0 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68          lockPath
327c0 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20  [pathLen] = 0;. 
327d0 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c             tempL
327e0 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
327f0 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  th;.            
32800 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
32810 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
32820 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  /* create a copy
32830 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74   of the lock pat
32840 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  h if the conch i
32850 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
32860 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32870 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
32880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32890 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d  else if( hostIdM
328a0 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20  atch.           
328b0 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28      && !strncmp(
328c0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
328d0 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
328e0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a  OXY_PATHINDEX],.
328f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32900 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 4c             readL
32910 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en-PROXY_PATHIND
32920 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  EX).        ){. 
32930 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63           /* conc
32940 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20  h host and lock 
32950 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20  path match */.  
32960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32970 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20  _takeconch; .   
32980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32990 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69       .      /* i
329a0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  f the conch isn'
329b0 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64  t writable and d
329c0 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65  oesn't match, we
329d0 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a   can't take it *
329e0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e  /.      if( (con
329f0 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
32a00 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29  s&O_RDWR) == 0 )
32a10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
32a20 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
32a30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
32a40 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a  econch;.      }.
32a50 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
32a60 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68  either the conch
32a70 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72   didn't match or
32a80 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
32a90 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a  te a new one */.
32aa0 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
32ab0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
32ac0 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 47  {.        proxyG
32ad0 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d  etLockPath(pCtx-
32ae0 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74  >dbPath, lockPat
32af0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
32b00 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
32b10 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
32b20 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61  .        /* crea
32b30 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
32b40 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79   lock path _only
32b50 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  _ if the conch i
32b60 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  s taken */.     
32b70 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
32b80 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20  /* update conch 
32b90 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61  with host and pa
32ba0 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61  th (this will fa
32bb0 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63  il if other proc
32bc0 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ess.      ** has
32bd0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
32be0 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65 20  lready), if the 
32bf0 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c  host id matches,
32c00 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20 20   use the big.   
32c10 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20     ** stick..   
32c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69     */.      futi
32c30 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mes(conchFile->h
32c40 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69  , NULL);.      i
32c50 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26  f( hostIdMatch &
32c60 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29  & !createConch )
32c70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
32c80 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  nchFile->pInode 
32c90 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49  && conchFile->pI
32ca0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
32cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
32cc0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
32cd0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
32ce0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
32cf0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
32d00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
32d10 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
32d20 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
32d30 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
32d40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32d50 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
32d60 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20   } else {       
32d70 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63     .          rc
32d80 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
32d90 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
32da0 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  D, EXCLUSIVE_LOC
32db0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
32dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32dd0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
32de0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
32df0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
32e00 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
32e10 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
32e20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
32e30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32e40 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69          char wri
32e50 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d  teBuffer[PROXY_M
32e60 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
32e70 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69       int writeSi
32e80 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
32e90 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75  .        writeBu
32ea0 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29  ffer[0] = (char)
32eb0 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
32ec0 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ON;.        memc
32ed0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
32ee0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
32ef0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
32f00 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
32f10 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
32f20 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e  lockProxyPath!=N
32f30 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
32f40 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
32f50 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
32f60 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f  INDEX], pCtx->lo
32f70 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  ckProxyPath, MAX
32f80 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
32f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32fa0 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
32fb0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
32fc0 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f  THINDEX], tempLo
32fd0 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
32fe0 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EN);.        }. 
32ff0 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65         writeSize
33000 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   = PROXY_PATHIND
33010 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69  EX + strlen(&wri
33020 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
33030 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20  ATHINDEX]);.    
33040 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e      robust_ftrun
33050 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  cate(conchFile->
33060 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20  h, writeSize);. 
33070 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
33080 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66  Write((sqlite3_f
33090 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
330a0 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77 72   writeBuffer, wr
330b0 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  iteSize, 0);.   
330c0 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68       fsync(conch
330d0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
330e0 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74    /* If we creat
330f0 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66  ed a new conch f
33100 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70  ile (not just up
33110 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e  dated the conten
33120 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20  ts of a .       
33130 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68    ** valid conch
33140 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d   file), try to m
33150 61 74 63 68 20 74 68 65 20 70 65 72 6d 69 73 73  atch the permiss
33160 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61  ions of the data
33170 62 61 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a  base .         *
33180 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
33190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
331a0 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20  reateConch ){.  
331b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
331c0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20  tat buf;.       
331d0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 6f 73 46     int err = osF
331e0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
331f0 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  buf);.          
33200 69 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20  if( err==0 ){.  
33210 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74            mode_t
33220 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f   cmode = buf.st_
33230 6d 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f  mode&(S_IRUSR|S_
33240 49 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c  IWUSR | S_IRGRP|
33250 53 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20  S_IWGRP |.      
33260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33280 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54    S_IROTH|S_IWOT
33290 48 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  H);.            
332a0 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  /* try to match 
332b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
332c0 65 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e  e R/W permission
332d0 73 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72  s, ignore failur
332e0 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
332f0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
33300 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 46 63              osFc
33310 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  hmod(conchFile->
33320 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65  h, cmode);.#else
33330 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b  .            do{
33340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
33350 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e  c = osFchmod(con
33360 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
33370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
33380 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20  while( rc==(-1) 
33390 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
333a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
333b0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
333c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
333d0 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
333e0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
333f0 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
33400 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68  d %o FAILED with
33410 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
33420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33430 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74   cmode, code, st
33440 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20  rerror(code));. 
33450 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
33460 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
33470 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
33480 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43  , "fchmod %o SUC
33490 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b  CEDED\n",cmode);
334a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
334b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
334c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
334d0 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
334e0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
334f0 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20  f(stderr, "STAT 
33500 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20  FAILED[%d] with 
33510 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  %d %s\n", .     
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
33530 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  rr, code, strerr
33540 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69  or(code));.#endi
33550 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  f.          }.  
33560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33570 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
33580 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
33590 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
335a0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
335b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
335c0 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  .    end_takecon
335d0 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ch:.      OSTRAC
335e0 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E(("TRANSPROXY: 
335f0 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46  CLOSE  %d\n", pF
33600 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
33610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33620 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
33630 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  Flags ){.       
33640 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 20 20 20   int fd;.       
33650 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
33660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f   ){.          ro
33670 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
33680 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
33690 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d  NE__);.        }
336a0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
336b0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  h = -1;.        
336c0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
336d0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
336e0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c  File->openFlags,
336f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33700 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
33710 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
33720 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20  SSIONS);.       
33730 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
33740 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c  PROXY: OPEN  %d\
33750 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20  n", fd));.      
33760 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
33770 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
33780 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20  h = fd;.        
33790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
337a0 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
337b0 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c  PEN_BKPT; /* SQL
337c0 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54  ITE_BUSY? proxyT
337d0 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a  akeConch called.
337e0 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e             durin
337f0 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  g locking */.   
33800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33810 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33820 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d  ITE_OK && !pCtx-
33830 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20  >lockProxy ){.  
33840 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68        char *path
33850 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   = tempLockPath 
33860 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a  ? tempLockPath :
33870 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33880 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63  Path;.        rc
33890 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e   = proxyCreateUn
338a0 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43  ixFile(path, &pC
338b0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31  tx->lockProxy, 1
338c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
338d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
338e0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
338f0 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61   && tryOldLockPa
33900 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
33910 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63  /* we couldn't c
33920 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20  reate the proxy 
33930 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74  lock file with t
33940 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65  he old lock file
33950 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
33960 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e   ** so try again
33970 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67   via auto-naming
33980 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a   .           */.
33990 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e            forceN
339a0 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a  ewLockPath = 1;.
339b0 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
339c0 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
339d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
339e0 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20  ; /* go back to 
339f0 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20  the do {} while 
33a00 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79  start point, try
33a10 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
33a20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33a30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
33a50 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  * Need to make a
33a60 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66   copy of path if
33a70 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68   we extracted th
33a80 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
33a90 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e   ** from the con
33aa0 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  ch file or the p
33ab0 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  ath was allocate
33ac0 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20  d on the stack. 
33ad0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33ae0 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50     if( tempLockP
33af0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
33b00 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33b10 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
33b20 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f  StrDup(0, tempLo
33b30 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  ckPath);.       
33b40 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
33b50 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
33b60 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
33b70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
33b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33ba0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
33bc0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
33bd0 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   1;.        .   
33be0 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
33bf0 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
33c00 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  d == &afpIoMetho
33c10 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ds ){.          
33c20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
33c30 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20  t *afpCtx;.     
33c40 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61       afpCtx = (a
33c50 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
33c60 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   *)pCtx->lockPro
33c70 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  xy->lockingConte
33c80 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  xt;.          af
33c90 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70  pCtx->dbPath = p
33ca0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
33cb0 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  th;.        }.  
33cc0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
33cd0 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e       conchFile->
33ce0 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
33cf0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
33d00 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f  conchFile, NO_LO
33d10 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
33d20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
33d30 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
33d40 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
33d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
33d60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b  c==SQLITE_OK?"ok
33d70 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ":"failed"));.  
33d80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
33d90 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20     } while (1); 
33da0 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65  /* in case we ne
33db0 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65 20  ed to retry the 
33dc0 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65  :auto: lock file
33dd0 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   - .            
33de0 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c       ** we shoul
33df0 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72 65  d never get here
33e00 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65 20   except via the 
33e10 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e  'continue' call.
33e20 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   */.  }.}../*.**
33e30 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20   If pFile holds 
33e40 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63  a lock on a conc
33e50 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c  h file, then rel
33e60 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a  ease that lock..
33e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
33e80 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28  oxyReleaseConch(
33e90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
33ea0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33eb0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
33ec0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65  /* Subroutine re
33ed0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70  turn code */.  p
33ee0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33ef0 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68  xt *pCtx;  /* Th
33f00 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
33f10 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20  t for the proxy 
33f20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69  lock */.  unixFi
33f30 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
33f40 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
33f50 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
33f60 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72  */..  pCtx = (pr
33f70 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33f80 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
33f90 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e  ngContext;.  con
33fa0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
33fb0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52  onchFile;.  OSTR
33fc0 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e  ACE(("RELEASECON
33fd0 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
33fe0 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
33ff0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
34000 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
34010 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
34020 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
34030 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20  :auto:"), .     
34040 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29        getpid()))
34050 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f  ;.  if( pCtx->co
34060 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
34070 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
34080 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
34090 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
340a0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
340b0 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78  OCK);.  }.  pCtx
340c0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b  ->conchHeld = 0;
340d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c  .  OSTRACE(("REL
340e0 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73  EASECONCH  %d %s
340f0 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
34100 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72  h,.           (r
34110 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
34120 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
34130 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34140 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
34150 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
34160 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70  abase file, comp
34170 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ute the name of 
34180 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  its conch file..
34190 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e  ** Store the con
341a0 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d  ch filename in m
341b0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
341c0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
341d0 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70  oc()..** Make *p
341e0 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20  ConchPath point 
341f0 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e  to the new name.
34200 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
34210 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
34220 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
34230 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62   if unable to ob
34240 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  tain memory..**.
34250 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
34260 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
34270 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
34280 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
34290 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20  ory.** space is 
342a0 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
342b0 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50  ..**.** *pConchP
342c0 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ath is set to NU
342d0 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61  LL if a memory a
342e0 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
342f0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
34300 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
34310 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63  eConchPathname(c
34320 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
34330 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b  r **pConchPath){
34340 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
34350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34360 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
34370 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20   */.  int len = 
34380 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
34390 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f  th); /* Length o
343a0 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  f database filen
343b0 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a  ame - dbPath */.
343c0 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74    char *conchPat
343d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
343e0 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68 69  /* buffer in whi
343f0 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  ch to construct 
34400 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20  conch name */.. 
34410 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
34420 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  ce for the conch
34430 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e   filename and in
34440 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d  itialize the nam
34450 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61  e to.  ** the na
34460 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  me of the origin
34470 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
34480 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68  . */  .  *pConch
34490 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68  Path = conchPath
344a0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
344b0 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20  e3_malloc(len + 
344c0 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50  8);.  if( conchP
344d0 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ath==0 ){.    re
344e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
344f0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
34500 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74  conchPath, dbPat
34510 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20  h, len+1);.  .  
34520 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20  /* now insert a 
34530 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c  "." before the l
34540 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72 20  ast / character 
34550 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e  */.  for( i=(len
34560 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29  -1); i>=0; i-- )
34570 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50  {.    if( conchP
34580 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ath[i]=='/' ){. 
34590 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
345a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
345b0 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d  .  conchPath[i]=
345c0 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69  '.';.  while ( i
345d0 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63  <len ){.    conc
345e0 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74  hPath[i+1]=dbPat
345f0 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20  h[i];.    i++;. 
34600 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20   }..  /* append 
34610 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66  the "-conch" suf
34620 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fix to the file 
34630 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e  */.  memcpy(&con
34640 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63  chPath[i+1], "-c
34650 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73  onch", 7);.  ass
34660 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e  ert( (int)strlen
34670 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c  (conchPath) == l
34680 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72  en+7 );..  retur
34690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
346a0 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c  ./* Takes a full
346b0 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f  y configured pro
346c0 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65  xy locking-style
346d0 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73   unix file and s
346e0 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c  witches.** the l
346f0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
34700 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath .*/.static i
34710 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f  nt switchLockPro
34720 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20  xyPath(unixFile 
34730 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68  *pFile, const ch
34740 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72  ar *path) {.  pr
34750 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34760 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
34770 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
34780 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34790 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f  ntext;.  char *o
347a0 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c  ldPath = pCtx->l
347b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
347c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
347d0 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65  OK;..  if( pFile
347e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
347f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
34800 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
34810 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68    }  ..  /* noth
34820 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65  ing to do if the
34830 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a   path is NULL, :
34840 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73  auto: or matches
34850 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70 61   the existing pa
34860 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74  th */.  if( !pat
34870 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c  h || path[0]=='\
34880 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61  0' || !strcmp(pa
34890 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c  th, ":auto:") ||
348a0 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26  .    (oldPath &&
348b0 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74   !strncmp(oldPat
348c0 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48  h, path, MAXPATH
348d0 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74  LEN)) ){.    ret
348e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
348f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
34900 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20  File *lockProxy 
34910 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
34920 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  y;.    pCtx->loc
34930 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20  kProxy=NULL;.   
34940 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
34950 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f   = 0;.    if( lo
34960 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b  ckProxy!=NULL ){
34970 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72  .      rc=lockPr
34980 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
34990 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
349a0 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b  le *)lockProxy);
349b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
349c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
349d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f   sqlite3_free(lo
349e0 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a  ckProxy);.    }.
349f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34a00 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70  (oldPath);.    p
34a10 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
34a20 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
34a30 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20  rDup(0, path);. 
34a40 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72   }.  .  return r
34a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c  c;.}../*.** pFil
34a60 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61 74  e is a file that
34a70 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
34a80 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65   by a prior xOpe
34a90 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a  n call.  dbPath.
34aa0 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 62  ** is a string b
34ab0 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d  uffer at least M
34ac0 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72  AXPATHLEN+1 char
34ad0 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a  acters in size..
34ae0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
34af0 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65  ne find the file
34b00 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20  name associated 
34b10 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77  with pFile and w
34b20 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20  rites it.** int 
34b30 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  dbPath..*/.stati
34b40 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62  c int proxyGetDb
34b50 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28  PathForUnixFile(
34b60 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
34b70 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a   char *dbPath){.
34b80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
34b90 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69  PLE__).  if( pFi
34ba0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
34bb0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
34bc0 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65      /* afp style
34bd0 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65 6e   keeps a referen
34be0 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61 74  ce to the db pat
34bf0 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74  h in the filePat
34c00 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20  h field .    ** 
34c10 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f  of the struct */
34c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e  .    assert( (in
34c30 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  t)strlen((char*)
34c40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34c50 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c  ntext)<=MAXPATHL
34c60 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70  EN );.    strlcp
34c70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c  y(dbPath, ((afpL
34c80 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
34c90 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34ca0 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20  ntext)->dbPath, 
34cb0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d  MAXPATHLEN);.  }
34cc0 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69   else.#endif.  i
34cd0 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
34ce0 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  d == &dotlockIoM
34cf0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
34d00 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20   dot lock style 
34d10 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  uses the locking
34d20 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72   context to stor
34d30 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20  e the dot lock. 
34d40 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20     ** file path 
34d50 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  */.    int len =
34d60 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29   strlen((char *)
34d70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34d80 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28  ntext) - strlen(
34d90 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b  DOTLOCK_SUFFIX);
34da0 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61  .    memcpy(dbPa
34db0 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
34dc0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
34dd0 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d  t, len + 1);.  }
34de0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  else{.    /* all
34df0 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73   other styles us
34e00 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  e the locking co
34e10 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
34e20 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20  he db file path 
34e30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
34e40 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
34e50 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34e60 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
34e70 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64  );.    strlcpy(d
34e80 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70  bPath, (char *)p
34e90 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34ea0 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e  text, MAXPATHLEN
34eb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
34ed0 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72  .** Takes an alr
34ee0 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75  eady filled in u
34ef0 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74  nix file and alt
34f00 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69  ers it so all fi
34f10 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77  le locking .** w
34f20 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64  ill be performed
34f30 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72   on the local pr
34f40 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20  oxy lock file.  
34f50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
34f60 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73  elds.** are pres
34f70 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63  erved in the loc
34f80 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20  king context so 
34f90 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
34fa0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a   restored and .*
34fb0 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63  * the unix struc
34fc0 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c  ture properly cl
34fd0 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73  eaned up at clos
34fe0 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f  e time:.**  ->lo
34ff0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20  ckingContext.** 
35000 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74   ->pMethod.*/.st
35010 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
35020 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
35030 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
35040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
35050 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  h) {.  proxyLock
35060 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
35070 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68 5b  ;.  char dbPath[
35080 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20  MAXPATHLEN+1];  
35090 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
350a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
350b0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
350c0 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e  kPath=NULL;.  in
350d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
350e0 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65  ;.  .  if( pFile
350f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
35100 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
35110 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
35120 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62    }.  proxyGetDb
35130 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28  PathForUnixFile(
35140 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a  pFile, dbPath);.
35150 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70    if( !path || p
35160 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20  ath[0]=='\0' || 
35170 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a  !strcmp(path, ":
35180 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c  auto:") ){.    l
35190 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20  ockPath=NULL;.  
351a0 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50  }else{.    lockP
351b0 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68  ath=(char *)path
351c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41  ;.  }.  .  OSTRA
351d0 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20  CE(("TRANSPROXY 
351e0 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
351f0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
35200 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b             (lock
35210 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20  Path ? lockPath 
35220 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74  : ":auto:"), get
35230 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74 78  pid()));..  pCtx
35240 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
35250 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
35260 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d   );.  if( pCtx==
35270 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
35280 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
35290 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c  }.  memset(pCtx,
352a0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78   0, sizeof(*pCtx
352b0 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78  ));..  rc = prox
352c0 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68  yCreateConchPath
352d0 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43  name(dbPath, &pC
352e0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
352f0 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  h);.  if( rc==SQ
35300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
35310 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
35320 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f  nixFile(pCtx->co
35330 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43  nchFilePath, &pC
35340 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30  tx->conchFile, 0
35350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
35360 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26  QLITE_CANTOPEN &
35370 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  & ((pFile->openF
35380 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20  lags&O_RDWR) == 
35390 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  0) ){.      /* i
353a0 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66  f (a) the open f
353b0 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52  lags are not O_R
353c0 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e  DWR, (b) the con
353d0 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20  ch isn't there, 
353e0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29  and.      ** (c)
353f0 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
35400 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
35410 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f  hen enable no-lo
35420 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20  cking access..  
35430 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63      ** Ugh, sinc
35440 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30  e O_RDONLY==0x00
35450 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20 21  00 we test for !
35460 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69  O_RDWR since uni
35470 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20  xOpen asserts.  
35480 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e      ** that open
35490 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20  Flags will have 
354a0 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44  only one of O_RD
354b0 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a  ONLY or O_RDWR..
354c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
354d0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
354e0 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
354f0 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f  t stat conchInfo
35500 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f  ;.      int goLo
35510 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20  ckless = 0;..   
35520 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 70 43     if( osStat(pC
35530 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
35540 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d  h, &conchInfo) =
35550 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20  = -1 ) {.       
35560 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
35570 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
35580 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28  rr==ENOENT) && (
35590 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26  statfs(dbPath, &
355a0 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29  fsInfo) != -1) )
355b0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f  {.          goLo
355c0 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f  ckless = (fsInfo
355d0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f  .f_flags&MNT_RDO
355e0 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e  NLY) == MNT_RDON
355f0 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  LY;.        }.  
35600 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35610 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20  goLockless ){.  
35620 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
35630 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72  hHeld = -1; /* r
35640 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63  ead only FS/ loc
35650 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  kless */.       
35660 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35680 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53   }  .  if( rc==S
35690 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b  QLITE_OK && lock
356a0 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78  Path ){.    pCtx
356b0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
356c0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
356d0 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a  p(0, lockPath);.
356e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
356f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35700 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73  pCtx->dbPath = s
35710 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
35720 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69  , dbPath);.    i
35730 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d  f( pCtx->dbPath=
35740 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
35750 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
35760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
35770 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35780 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65  ){.    /* all me
35790 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65  mory is allocate
357a0 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72  d, proxys are cr
357b0 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e  eated and assign
357c0 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74  ed, .    ** swit
357d0 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  ch the locking c
357e0 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68  ontext and pMeth
357f0 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a  od then return..
35800 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d      */.    pCtx-
35810 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
35820 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt = pFile->lock
35830 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
35840 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
35850 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20  ntext = pCtx;.  
35860 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68    pCtx->pOldMeth
35870 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  od = pFile->pMet
35880 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  hod;.    pFile->
35890 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79  pMethod = &proxy
358a0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
358b0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78  se{.    if( pCtx
358c0 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a  ->conchFile ){ .
358d0 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
358e0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
358f0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
35900 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e  file *)pCtx->con
35910 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73  chFile);.      s
35920 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
35930 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  ->conchFile);.  
35940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
35950 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c  bFree(0, pCtx->l
35960 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20  ockProxyPath);. 
35970 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35980 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
35990 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74  ath); .    sqlit
359a0 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20  e3_free(pCtx);. 
359b0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
359c0 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73  RANSPROXY  %d %s
359d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
359e0 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53            (rc==S
359f0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
35a00 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20  : "failed")));. 
35a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
35a20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
35a30 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74  ne handles sqlit
35a40 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
35a50 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65  ) calls that are
35a60 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
35a70 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
35a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
35a90 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
35aa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
35ab0 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
35ac0 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
35ad0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
35ae0 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
35af0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
35b00 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
35b10 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
35b20 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
35b30 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72  ->pMethod == &pr
35b40 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  oxyIoMethods ){.
35b50 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63          proxyLoc
35b60 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
35b70 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
35b80 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
35b90 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
35ba0 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54 61  .        proxyTa
35bb0 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
35bc0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
35bd0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
35be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63  ){.          *(c
35bf0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
35c00 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  g = pCtx->lockPr
35c10 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
35c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35c30 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
35c40 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a  *)pArg = ":auto:
35c50 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20   (not held)";.  
35c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
35c70 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a  else {.        *
35c80 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
35c90 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Arg = NULL;.    
35ca0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
35cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
35cc0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
35cd0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
35ce0 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ILE: {.      uni
35cf0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
35d00 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
35d10 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
35d20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e  ITE_OK;.      in
35d30 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d  t isProxyStyle =
35d40 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64   (pFile->pMethod
35d50 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
35d60 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ods);.      if( 
35d70 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63  pArg==NULL || (c
35d80 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67  onst char *)pArg
35d90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
35da0 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  f( isProxyStyle 
35db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
35dc0 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c  turn off proxy l
35dd0 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70  ocking - not sup
35de0 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  ported */.      
35df0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35e00 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50  ERROR /*SQLITE_P
35e10 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f  ROTOCOL? SQLITE_
35e20 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20  MISUSE?*/;.     
35e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35e40 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20      /* turn off 
35e50 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20  proxy locking - 
35e60 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f  already off - NO
35e70 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  OP */.          
35e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35e90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
35eb0 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79  onst char *proxy
35ec0 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
35ed0 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  ar *)pArg;.     
35ee0 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
35ef0 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
35f00 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
35f10 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20  text *pCtx = .  
35f20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79            (proxy
35f30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
35f40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
35f50 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  ntext;.         
35f60 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72   if( !strcmp(pAr
35f70 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20  g, ":auto:") .  
35f80 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74           || (pCt
35f90 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35fa0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
35fb0 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78     !strncmp(pCtx
35fc0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
35fd0 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50   proxyPath, MAXP
35fe0 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20  ATHLEN)).       
35ff0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
36000 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
36010 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
36020 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
36030 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  c = switchLockPr
36040 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70  oxyPath(pFile, p
36050 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
36060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
36070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36080 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79  /* turn on proxy
36090 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
360a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
360b0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
360c0 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72  ixFile(pFile, pr
360d0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
360e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
360f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36100 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
36110 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36120 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c  0 );  /* The cal
36130 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f  l assures that o
36140 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65  nly valid opcode
36150 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20  s are sent */.  
36160 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
36170 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72  EACHED*/.  retur
36180 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
36190 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  }../*.** Within 
361a0 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74  this division (t
361b0 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  he proxying lock
361c0 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
361d0 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72  on) the procedur
361e0 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73  es.** above this
361f0 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75   point are all u
36200 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c  tilities.  The l
36210 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68  ock-related meth
36220 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72  ods of the.** pr
36230 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69  oxy-locking sqli
36240 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62  te3_io_method ob
36250 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a  ject follow..*/.
36260 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
36270 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
36280 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
36290 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
362a0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
362b0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
362c0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
362d0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
362e0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
362f0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
36300 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
36310 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
36320 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
36330 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
36340 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
36350 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
36360 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
36370 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
36380 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
36390 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
363a0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
363b0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
363c0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
363d0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
363e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
363f0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
36400 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  = proxyTakeConch
36410 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
36420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36430 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
36440 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
36450 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
36460 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
36470 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
36480 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
36490 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20  hHeld>0 ){.     
364a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79   unixFile *proxy
364b0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
364c0 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  xy;.      return
364d0 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
364e0 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  >xCheckReservedL
364f0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
36500 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75  e*)proxy, pResOu
36510 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f  t);.    }else{ /
36520 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20  * conchHeld < 0 
36530 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  is lockless */. 
36540 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a       pResOut=0;.
36550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
36560 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36570 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
36580 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
36590 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
365a0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
365b0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
365c0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
365d0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
365e0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
365f0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
36600 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
36610 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
36620 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
36630 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
36640 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
36650 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
36660 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
36670 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
36680 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
36690 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
366a0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
366b0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
366c0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
366d0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
366e0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
366f0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
36700 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
36710 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
36720 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
36730 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
36740 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
36750 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
36760 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
36770 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
36780 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
36790 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
367a0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
367b0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
367c0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
367d0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
367e0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
367f0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
36800 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
36810 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
36820 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36830 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
36840 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
36850 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
36860 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
36870 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
36880 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
36890 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
368a0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
368b0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
368c0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
368d0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
368e0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
368f0 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  c = proxyTakeCon
36900 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ch(pFile);.  if(
36910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36920 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  {.    proxyLocki
36930 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
36940 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
36950 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
36960 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
36970 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
36980 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
36990 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
369a0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
369b0 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  roxy;.      rc =
369c0 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
369d0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
369e0 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69  file*)proxy, eFi
369f0 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70  leLock);.      p
36a00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
36a10 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f  = proxy->eFileLo
36a20 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
36a30 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c       /* conchHel
36a40 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73  d < 0 is lockles
36a50 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s */.    }.  }. 
36a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
36a70 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
36a80 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
36a90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
36aa0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
36ab0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
36ac0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
36ad0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
36ae0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
36af0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
36b00 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
36b10 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
36b20 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
36b30 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
36b40 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
36b50 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
36b60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
36b70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
36b80 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
36b90 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
36ba0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
36bb0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
36bc0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
36bd0 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
36be0 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
36bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36c00 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
36c10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
36c20 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
36c30 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
36c40 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36c50 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
36c60 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
36c70 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
36c80 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
36c90 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
36ca0 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
36cb0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
36cc0 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
36cd0 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  , eFileLock);.  
36ce0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
36cf0 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46  Lock = proxy->eF
36d00 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  ileLock;.    }el
36d10 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e  se{.      /* con
36d20 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f  chHeld < 0 is lo
36d30 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a  ckless */.    }.
36d40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
36d60 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73  a file that uses
36d70 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f   proxy locks..*/
36d80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36d90 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
36da0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
36db0 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
36dc0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
36dd0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
36de0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36df0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36e00 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36e10 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36e20 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e  gContext;.    un
36e30 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
36e40 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
36e50 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c  oxy;.    unixFil
36e60 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
36e70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
36e80 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
36e90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20  ITE_OK;.    .   
36ea0 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29   if( lockProxy )
36eb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
36ec0 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
36ed0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
36ee0 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78  3_file*)lockProx
36ef0 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  y, NO_LOCK);.   
36f00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
36f10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
36f20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  = lockProxy->pMe
36f30 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
36f40 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b  lite3_file*)lock
36f50 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66  Proxy);.      if
36f60 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
36f80 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b  free(lockProxy);
36f90 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  .      pCtx->loc
36fa0 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20  kProxy = 0;.    
36fb0 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46  }.    if( conchF
36fc0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
36fd0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
36fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36ff0 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
37000 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ch(pFile);.     
37010 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
37020 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
37030 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
37040 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
37050 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
37060 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  le*)conchFile);.
37070 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
37080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e  sqlite3_free(con
370a0 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  chFile);.    }. 
370b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
370c0 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  (0, pCtx->lockPr
370d0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71  oxyPath);.    sq
370e0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
370f0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
37100 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
37110 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50 61  ee(0, pCtx->dbPa
37120 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74  th);.    /* rest
37130 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ore the original
37140 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
37150 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65   and pMethod the
37160 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20  n close it */.  
37170 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67    pFile->locking
37180 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e  Context = pCtx->
37190 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
371a0 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d  t;.    pFile->pM
371b0 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f  ethod = pCtx->pO
371c0 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71  ldMethod;.    sq
371d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29  lite3_free(pCtx)
371e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69  ;.    return pFi
371f0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
37200 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ose(id);.  }.  r
37210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37220 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  .}....#endif /* 
37230 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
37240 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
37250 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
37260 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  E */./*.** The p
37270 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79  roxy locking sty
37280 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66  le is intended f
37290 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20  or use with AFP 
372a0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20  filesystems..** 
372b0 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73  And since AFP is
372c0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
372d0 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70  on MacOSX, the p
372e0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
372f0 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74  also.** restrict
37300 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a  ed to MacOSX..**
37310 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
37320 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
37330 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69  the proxy lock i
37340 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
37350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37360 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
37370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
373a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
373b0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ***/../*.** Init
373c0 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
373d0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
373e0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rface..**.** Thi
373f0 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
37400 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c  ers all VFS impl
37410 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
37420 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74  unix-like operat
37430 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20  ing.** systems. 
37440 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   This routine, a
37450 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f  nd the sqlite3_o
37460 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20  s_end() routine 
37470 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a  that follows,.**
37480 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f   should be the o
37490 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  nly routines in 
374a0 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61  this file that a
374b0 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20  re visible from 
374c0 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a  other.** files..
374d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
374e0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
374f0 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  e during SQLite 
37500 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61  initialization a
37510 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c  nd by a.** singl
37520 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d  e thread.  The m
37530 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
37540 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79   and mutex subsy
37550 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a  stems have not.*
37560 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65  * necessarily be
37570 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  en initialized w
37580 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
37590 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20   is called, and 
375a0 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  so they.** shoul
375b0 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a  d not be used..*
375c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
375d0 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20  _init(void){ .  
375e0 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  /* .  ** The fol
375f0 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66  lowing macro def
37600 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ines an initiali
37610 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74  zer for an sqlit
37620 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20  e3_vfs object.. 
37630 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   ** The name of 
37640 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e  the VFS is NAME.
37650 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69    The pAppData i
37660 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
37670 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f   pointer.  ** to
37680 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75   the "finder" fu
37690 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61  nction.  (pAppDa
376a0 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
376b0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63  to a pointer bec
376c0 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20  ause.  ** silly 
376d0 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62  C90 rules prohib
376e0 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20  it a void* from 
376f0 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20  being cast to a 
37700 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
37710 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20  .  ** and so we 
37720 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75  have to go throu
37730 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  gh the intermedi
37740 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  ate pointer to a
37750 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20  void problems.  
37760 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
37770 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  g with -pedantic
37780 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29  -errors on GCC.)
37790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46  .  **.  ** The F
377a0 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20  INDER parameter 
377b0 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
377c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
377d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
377e0 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63    ** finder-func
377f0 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65  tion.  The finde
37800 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  r-function retur
37810 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
37820 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
37830 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
37840 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
37850 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f  s the desired lo
37860 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76  cking.  ** behav
37870 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64  iors.  See the d
37880 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68  ivision above th
37890 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
378a0 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d  IOMETHODS.  ** m
378b0 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f  acro for additio
378c0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  n information on
378d0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
378e0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73  s..  **.  ** Mos
378f0 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79  t finders simply
37900 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
37910 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
37920 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
37930 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75    ** object.  Bu
37940 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49  t the "autolockI
37950 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62  oFinder" availab
37960 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65  le on MacOSX doe
37970 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20  s a little.  ** 
37980 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20  more than that; 
37990 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  it looks at the 
379a0 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
379b0 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a  that hosts the .
379c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
379d0 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  le and tries to 
379e0 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e  choose an lockin
379f0 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72  g method appropr
37a00 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68  iate for.  ** th
37a10 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69  at filesystem ti
37a20 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69  me..  */.  #defi
37a30 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41  ne UNIXVFS(VFSNA
37a40 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20  ME, FINDER) {   
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a60 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20 20       \.    3,   
37a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a80 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20   /* iVersion */ 
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37aa0 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28     \.    sizeof(
37ab0 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f  unixFile),     /
37ac0 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20  * szOsFile */   
37ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ae0 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e   \.    MAX_PATHN
37af0 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  AME,         /* 
37b00 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20  mxPathname */   
37b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37b20 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
37b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
37b40 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ext */          
37b50 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37b60 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20     VFSNAME,     
37b70 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
37b80 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37b90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37ba0 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c   (void*)&FINDER,
37bb0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
37bc0 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ta */           
37bd0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37be0 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nixOpen,        
37bf0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
37c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c10 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37c20 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  xDelete,        
37c30 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
37c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c50 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41       \.    unixA
37c60 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
37c70 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20   /* xAccess */  
37c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c90 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c     \.    unixFul
37ca0 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
37cb0 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
37cc0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37cd0 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65   \.    unixDlOpe
37ce0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
37cf0 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20  xDlOpen */      
37d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37d10 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72  .    unixDlError
37d20 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
37d30 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  lError */       
37d40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37d50 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20     unixDlSym,   
37d60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
37d70 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ym */           
37d80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37d90 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20   unixDlClose,   
37da0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
37db0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
37dc0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37dd0 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  nixRandomness,  
37de0 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
37df0 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ess */          
37e00 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37e10 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  xSleep,         
37e20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20     /* xSleep */ 
37e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e40 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43       \.    unixC
37e50 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
37e60 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
37e70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37e80 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74     \.    unixGet
37e90 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
37ea0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
37eb0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37ec0 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65   \.    unixCurre
37ed0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
37ee0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
37ef0 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 5c  4 */           \
37f00 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79 73 74  .    unixSetSyst
37f10 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
37f20 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20  etSystemCall */ 
37f30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37f40 20 20 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d     unixGetSystem
37f50 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
37f60 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
37f70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37f80 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43   unixNextSystemC
37f90 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
37fa0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20  ystemCall */    
37fb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a           \.  }..
37fc0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65    /*.  ** All de
37fd0 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20  fault VFSes for 
37fe0 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e  unix are contain
37ff0 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
38000 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a  ing array..  **.
38010 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
38020 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70  he sqlite3_vfs.p
38030 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74 68  Next field of th
38040 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73 20  e VFS object is 
38050 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62 79  modified.  ** by
38060 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
38070 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69 73   when the VFS is
38080 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53 6f   registered.  So
38090 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
380a0 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f 74   ** array cannot
380b0 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a   be const..  */.
380c0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
380d0 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a  _vfs aVfs[] = {.
380e0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
380f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
38100 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c  && (OS_VXWORKS |
38110 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  | defined(__APPL
38120 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56 46  E__)).    UNIXVF
38130 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20  S("unix",       
38140 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e     autolockIoFin
38150 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20  der ),.#else.   
38160 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c   UNIXVFS("unix",
38170 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78 49            posixI
38180 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
38190 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  f.    UNIXVFS("u
381a0 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e  nix-none",     n
381b0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  olockIoFinder ),
381c0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
381d0 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f  ix-dotfile",  do
381e0 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  tlockIoFinder ),
381f0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38200 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70 6f  ix-excl",     po
38210 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  sixIoFinder ),.#
38220 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
38230 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
38240 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f  namedsem", semIo
38250 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
38260 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
38270 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
38280 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38290 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f  ix-posix",    po
382a0 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  sixIoFinder ),.#
382b0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
382c0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
382d0 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63  -flock",    floc
382e0 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e  kIoFinder ),.#en
382f0 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  dif.#endif.#if S
38300 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
38310 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
38320 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
38330 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38340 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66  ix-afp",      af
38350 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  pIoFinder ),.   
38360 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e   UNIXVFS("unix-n
38370 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46  fs",      nfsIoF
38380 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
38390 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79  XVFS("unix-proxy
383a0 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e  ",    proxyIoFin
383b0 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20  der ),.#endif.  
383c0 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
383d0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
383e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
383f0 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68  ..  /* Double-ch
38400 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79  eck that the aSy
38410 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61  scall[] array ha
38420 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  s been construct
38430 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c  ed.  ** correctl
38440 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b  y.  See ticket [
38450 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61  bb3a86e890c8e96a
38460 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  b] */.  assert( 
38470 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
38480 6c 6c 29 3d 3d 32 30 20 29 3b 0a 0a 20 20 2f 2a  ll)==20 );..  /*
38490 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46   Register all VF
384a0 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  Ses defined in t
384b0 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20  he aVfs[] array 
384c0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
384d0 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69  (sizeof(aVfs)/si
384e0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73  zeof(sqlite3_vfs
384f0 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  )); i++){.    sq
38500 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
38510 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d  er(&aVfs[i], i==
38520 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
38530 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
38540 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
38550 68 65 20 6f 70 65 72 61 74