/ Hex Artifact Content
Login

Artifact fc3159578369b57acbc838fd0e5948c044d02b89:


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 23 69 6e  nix only */..#in
0850: 63 6c 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e  clude "btreeInt.
0860: 68 22 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h"           /* 
0870: 55 73 65 20 62 79 20 41 70 70 6c 65 20 65 78 74  Use by Apple ext
0880: 65 6e 73 69 6f 6e 73 20 6f 6e 6c 79 20 2a 2f 0a  ensions only */.
0890: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ../*.** There ar
08a0: 65 20 76 61 72 69 6f 75 73 20 6d 65 74 68 6f 64  e various method
08b0: 73 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69  s for file locki
08c0: 6e 67 20 75 73 65 64 20 66 6f 72 20 63 6f 6e 63  ng used for conc
08d0: 75 72 72 65 6e 63 79 0a 2a 2a 20 63 6f 6e 74 72  urrency.** contr
08e0: 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50  ol:.**.**   1. P
08f0: 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 28 74 68  OSIX locking (th
0900: 65 20 64 65 66 61 75 6c 74 29 2c 0a 2a 2a 20 20  e default),.**  
0910: 20 32 2e 20 4e 6f 20 6c 6f 63 6b 69 6e 67 2c 0a   2. No locking,.
0920: 2a 2a 20 20 20 33 2e 20 44 6f 74 2d 66 69 6c 65  **   3. Dot-file
0930: 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 34   locking,.**   4
0940: 2e 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  . flock() lockin
0950: 67 2c 0a 2a 2a 20 20 20 35 2e 20 41 46 50 20 6c  g,.**   5. AFP l
0960: 6f 63 6b 69 6e 67 20 28 4f 53 58 20 6f 6e 6c 79  ocking (OSX only
0970: 29 2c 0a 2a 2a 20 20 20 36 2e 20 4e 61 6d 65 64  ),.**   6. Named
0980: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
0990: 73 20 28 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 29  s (VXWorks only)
09a0: 2c 0a 2a 2a 20 20 20 37 2e 20 70 72 6f 78 79 20  ,.**   7. proxy 
09b0: 6c 6f 63 6b 69 6e 67 2e 20 28 4f 53 58 20 6f 6e  locking. (OSX on
09c0: 6c 79 29 0a 2a 2a 0a 2a 2a 20 53 74 79 6c 65 73  ly).**.** Styles
09d0: 20 34 2c 20 35 2c 20 61 6e 64 20 37 20 61 72 65   4, 5, and 7 are
09e0: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
09f0: 6f 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  of SQLITE_ENABLE
0a00: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2a  _LOCKING_STYLE.*
0a10: 2a 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  * is defined to 
0a20: 31 2e 20 20 54 68 65 20 53 51 4c 49 54 45 5f 45  1.  The SQLITE_E
0a30: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a40: 59 4c 45 20 61 6c 73 6f 20 65 6e 61 62 6c 65 73  YLE also enables
0a50: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 73 65   automatic.** se
0a60: 6c 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  lection of the a
0a70: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
0a80: 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20 6f  ng style based o
0a90: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
0aa0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 64 61  .** where the da
0ab0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 61 74 65  tabase is locate
0ac0: 64 2e 20 20 0a 2a 2f 0a 23 69 66 20 21 64 65 66  d.  .*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0ae0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0af0: 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28  ).#  if defined(
0b00: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20  __APPLE__).#    
0b10: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
0b20: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0b30: 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  LE 1.#  else.#  
0b40: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0b50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0b60: 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a  TYLE 0.#  endif.
0b70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0b80: 66 69 6e 65 20 74 68 65 20 4f 53 5f 56 58 57 4f  fine the OS_VXWO
0b90: 52 4b 53 20 70 72 65 2d 70 72 6f 63 65 73 73 6f  RKS pre-processo
0ba0: 72 20 6d 61 63 72 6f 20 74 6f 20 31 20 69 66 20  r macro to 1 if 
0bb0: 62 75 69 6c 64 69 6e 67 20 6f 6e 20 0a 2a 2a 20  building on .** 
0bc0: 76 78 77 6f 72 6b 73 2c 20 6f 72 20 30 20 6f 74  vxworks, or 0 ot
0bd0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 23 69 66 6e  herwise..*/.#ifn
0be0: 64 65 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23  def OS_VXWORKS.#
0bf0: 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 52    if defined(__R
0c00: 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  TP__) || defined
0c10: 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23 20  (_WRS_KERNEL).# 
0c20: 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58 57     define OS_VXW
0c30: 4f 52 4b 53 20 31 0a 23 20 20 65 6c 73 65 0a 23  ORKS 1.#  else.#
0c40: 20 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 56 58      define OS_VX
0c50: 57 4f 52 4b 53 20 30 0a 23 20 20 65 6e 64 69 66  WORKS 0.#  endif
0c60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c70: 68 65 73 65 20 23 64 65 66 69 6e 65 73 20 73 68  hese #defines sh
0c80: 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e 32 47 42  ould enable >2GB
0c90: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 6f 6e   file support on
0ca0: 20 50 6f 73 69 78 20 69 66 20 74 68 65 0a 2a 2a   Posix if the.**
0cb0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
0cc0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
0cd0: 70 6f 72 74 73 20 69 74 2e 20 20 49 66 20 74 68  ports it.  If th
0ce0: 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a 20 6c 61  e OS lacks.** la
0cf0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
0d00: 2c 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62  , these should b
0d10: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20  e no-ops..**.** 
0d20: 4c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  Large file suppo
0d30: 72 74 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c  rt can be disabl
0d40: 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d 44 53  ed using the -DS
0d50: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
0d60: 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f 6e 20 74  S switch.** on t
0d70: 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d  he compiler comm
0d80: 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68 69 73 20  and line.  This 
0d90: 69 73 20 6e 65 63 65 73 73 61 72 79 20 69 66 20  is necessary if 
0da0: 79 6f 75 20 61 72 65 20 63 6f 6d 70 69 6c 69 6e  you are compilin
0db0: 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63 65 6e 74  g.** on a recent
0dc0: 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65   machine (ex: Re
0dd0: 64 48 61 74 20 37 2e 32 29 20 62 75 74 20 79 6f  dHat 7.2) but yo
0de0: 75 20 77 61 6e 74 20 79 6f 75 72 20 63 6f 64 65  u want your code
0df0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61   to work.** on a
0e00: 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69 6e 65 20  n older machine 
0e10: 28 65 78 3a 20 52 65 64 48 61 74 20 36 2e 30 29  (ex: RedHat 6.0)
0e20: 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c  .  If you compil
0e30: 65 20 6f 6e 20 52 65 64 48 61 74 20 37 2e 32 0a  e on RedHat 7.2.
0e40: 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ** without this 
0e50: 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69 73 20 65  option, LFS is e
0e60: 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c 46 53 20  nable.  But LFS 
0e70: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
0e80: 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20  n the kernel.** 
0e90: 69 6e 20 52 65 64 48 61 74 20 36 2e 30 2c 20 73  in RedHat 6.0, s
0ea0: 6f 20 74 68 65 20 63 6f 64 65 20 77 6f 6e 27 74  o the code won't
0eb0: 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66   work.  Hence, f
0ec0: 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72  or maximum binar
0ed0: 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79  y.** portability
0ee0: 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74   you should omit
0ef0: 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   LFS..**.** The 
0f00: 70 72 65 76 69 6f 75 73 20 70 61 72 61 67 72 61  previous paragra
0f10: 70 68 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ph was written i
0f20: 6e 20 32 30 30 35 2e 20 20 28 54 68 69 73 20 70  n 2005.  (This p
0f30: 61 72 61 67 72 61 70 68 20 69 73 20 77 72 69 74  aragraph is writ
0f40: 74 65 6e 0a 2a 2a 20 6f 6e 20 32 30 30 38 2d 31  ten.** on 2008-1
0f50: 31 2d 32 38 2e 29 20 54 68 65 73 65 20 64 61 79  1-28.) These day
0f60: 73 2c 20 61 6c 6c 20 4c 69 6e 75 78 20 6b 65 72  s, all Linux ker
0f70: 6e 65 6c 73 20 73 75 70 70 6f 72 74 20 6c 61 72  nels support lar
0f80: 67 65 20 66 69 6c 65 73 2c 20 73 6f 0a 2a 2a 20  ge files, so.** 
0f90: 79 6f 75 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  you should proba
0fa0: 62 6c 79 20 6c 65 61 76 65 20 4c 46 53 20 65 6e  bly leave LFS en
0fb0: 61 62 6c 65 64 2e 20 20 42 75 74 20 73 6f 6d 65  abled.  But some
0fc0: 20 65 6d 62 65 64 64 65 64 20 70 6c 61 74 66 6f   embedded platfo
0fd0: 72 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 6c 61 63  rms might.** lac
0fe0: 6b 20 4c 46 53 20 69 6e 20 77 68 69 63 68 20 63  k LFS in which c
0ff0: 61 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 44  ase the SQLITE_D
1000: 49 53 41 42 4c 45 5f 4c 46 53 20 6d 61 63 72 6f  ISABLE_LFS macro
1010: 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 62 65 20   might still be 
1020: 75 73 65 66 75 6c 2e 0a 2a 2f 0a 23 69 66 6e 64  useful..*/.#ifnd
1030: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
1040: 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20 5f  E_LFS.# define _
1050: 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20 20  LARGE_FILE      
1060: 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49 4c   1.# ifndef _FIL
1070: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23 20  E_OFFSET_BITS.# 
1080: 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f 4f    define _FILE_O
1090: 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23 20  FFSET_BITS 64.# 
10a0: 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20 5f  endif.# define _
10b0: 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43 45  LARGEFILE_SOURCE
10c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
10d0: 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64   standard includ
10e0: 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63  e files..*/.#inc
10f0: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
1100: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1110: 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /stat.h>.#includ
1120: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63  e <fcntl.h>.#inc
1130: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
1140: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
1150: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1160: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
1170: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 6e 64   <errno.h>.#ifnd
1180: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1190: 41 4c 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  AL.#include <sys
11a0: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
11b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
11c0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11d0: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  E.# include <sys
11e0: 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c  /ioctl.h>.# incl
11f0: 75 64 65 20 3c 75 75 69 64 2f 75 75 69 64 2e 68  ude <uuid/uuid.h
1200: 3e 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f  >.# if defined(_
1210: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
1220: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
1230: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
1240: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e          (__IPHON
1270: 45 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  E_OS_VERSION_MIN
1280: 5f 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30  _REQUIRED > 2000
1290: 29 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  )).#  define HAV
12a0: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
12b0: 23 20 65 6e 64 69 66 0a 23 20 69 66 20 4f 53 5f  # endif.# if OS_
12c0: 56 58 57 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75  VXWORKS.#  inclu
12d0: 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e  de <semaphore.h>
12e0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d  .#  include <lim
12f0: 69 74 73 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20  its.h>.# else.# 
1300: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 66 69   include <sys/fi
1310: 6c 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  le.h>.#  include
1320: 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23   <sys/param.h>.#
1330: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a   endif.#endif /*
1340: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1350: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1370: 50 50 4c 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49  PPLE__) || (SQLI
1380: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1390: 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
13a0: 58 57 4f 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64  XWORKS).# includ
13b0: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
13c0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
13d0: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
13e0: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
13f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
1400: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
1410: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
1420: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
1430: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
1440: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
1450: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
1460: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
1470: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
1480: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
1490: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
14a0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
14b0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
14c0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
14d0: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
14e0: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
14f0: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
1500: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
1510: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
1520: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1530: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
1540: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1550: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1560: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1570: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1580: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1590: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
15a0: 0a 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20  ./*. ** Default 
15b0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
15c0: 20 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70   creating auto p
15d0: 72 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66  roxy dir. */.#if
15e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
15f0: 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
1600: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1610: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1620: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
1630: 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69  SIONS 0755.#endi
1640: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
1650: 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d   supported path-
1660: 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69  length..*/.#defi
1670: 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  ne MAX_PATHNAME 
1680: 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20  512../*.** Only 
1690: 73 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e  set the lastErrn
16a0: 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63  o if the error c
16b0: 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72  ode is a real er
16c0: 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20  ror and not .** 
16d0: 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65  a normal expecte
16e0: 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  d return code of
16f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
1700: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65  SQLITE_OK.*/.#de
1710: 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52  fine IS_LOCK_ERR
1720: 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51  OR(x)  ((x != SQ
1730: 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21  LITE_OK) && (x !
1740: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a  = SQLITE_BUSY)).
1750: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
1760: 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65  rences */.typede
1770: 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  f struct unixShm
1780: 20 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20   unixShm;       
1790: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
17a0: 63 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ction shared mem
17b0: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
17c0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
17d0: 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20  e unixShmNode;  
17e0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
17f0: 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a  emory instance *
1800: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1810: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75   unixInodeInfo u
1820: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20  nixInodeInfo;   
1830: 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a  /* An i-node */.
1840: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55  typedef struct U
1850: 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78  nixUnusedFd Unix
1860: 55 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a  UnusedFd;     /*
1870: 20 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   An unused file 
1880: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f  descriptor */../
1890: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20  *.** Sometimes, 
18a0: 61 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e  after a file han
18b0: 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79  dle is closed by
18c0: 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c   SQLite, the fil
18d0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
18e0: 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  cannot be closed
18f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e   immediately. In
1900: 20 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e   these cases, in
1910: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66  stances of the f
1920: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
1930: 63 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74  cture are used t
1940: 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
1950: 20 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c   descriptor whil
1960: 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e  e waiting for an
1970: 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  .** opportunity 
1980: 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20  to either close 
1990: 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a  or reuse it..*/.
19a0: 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65  struct UnixUnuse
19b0: 64 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20  dFd {.  int fd; 
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
19e0: 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f  ptor to close */
19f0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a10: 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20  Flags this file 
1a20: 64 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f  descriptor was o
1a30: 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20  pened with */.  
1a40: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
1a50: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78  ext;      /* Nex
1a60: 74 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  t unused file de
1a70: 73 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65  scriptor on same
1a80: 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   file */.};../*.
1a90: 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20  ** The unixFile 
1aa0: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62  structure is sub
1ab0: 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33  class of sqlite3
1ac0: 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74  _file specific t
1ad0: 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46  o the unix.** VF
1ae0: 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1af0: 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
1b00: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e  ruct unixFile un
1b10: 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75  ixFile;.struct u
1b20: 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69  nixFile {.  sqli
1b30: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
1b40: 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20  onst *pMethod;  
1b50: 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69  /* Always the fi
1b60: 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  rst entry */.  s
1b70: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b90: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68     /* The VFS th
1ba0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
1bb0: 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e  unixFile */.  un
1bc0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1bd0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1be0: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1bf0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1c00: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c30: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1c40: 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tor */.  unsigne
1c50: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
1c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c70: 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b  The type of lock
1c80: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64   held on this fd
1c90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1ca0: 68 61 72 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  har ctrlFlags;  
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 68            /* Beh
1cc0: 61 76 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55  avioral bits.  U
1cd0: 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20  NIXFILE_* flags 
1ce0: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72  */.  int lastErr
1cf0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d10: 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20  unix errno from 
1d20: 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1d30: 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  /.  void *lockin
1d40: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20  gContext;       
1d50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69          /* Locki
1d60: 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng style specifi
1d70: 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69  c state */.  Uni
1d80: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
1d90: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1da0: 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65   /* Pre-allocate
1db0: 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  d UnixUnusedFd *
1dc0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1dd0: 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  zPath;          
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1df0: 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1e00: 20 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20   unixShm *pShm; 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
1e30: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e  emory segment in
1e40: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  formation */.  i
1e50: 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20  nt szChunk;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1e80: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1e90: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1ea0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1eb0: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1ec0: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1ef0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1f00: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1f10: 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
1f20: 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74  PROTECTION.  int
1f30: 20 70 72 6f 74 46 6c 61 67 73 3b 20 20 20 20 20   protFlags;     
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 2f 2a 20 44 61 74 61 20 70 72 6f 74 65 63 74   /* Data protect
1f60: 69 6f 6e 20 66 6c 61 67 73 20 66 72 6f 6d 20 75  ion flags from u
1f70: 6e 69 78 4f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  nixOpen */.#endi
1f80: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1f90: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1fa0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1fb0: 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e  PPLE__).  unsign
1fc0: 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20  ed fsFlags;     
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe0: 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20   cached details 
1ff0: 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f  from statfs() */
2000: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
2010: 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69 73 44  XWORKS.  int isD
2020: 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20  elete;          
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2040: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
2050: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73 74 72  if true */.  str
2060: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
2070: 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  d *pId;         
2080: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
2090: 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ID */.#endif.#if
20a0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
20b0: 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
20c0: 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  of variables are
20d0: 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77   used to track w
20e0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
20f0: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2100: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79  on counter in by
2110: 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74  tes 24-27 of dat
2120: 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
2130: 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65  updated.  ** whe
2140: 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f  never any part o
2150: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
2160: 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65  hanges.  An asse
2170: 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c  rtion fault will
2180: 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61  .  ** occur if a
2190: 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
21a0: 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70   without also up
21b0: 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  dating the trans
21c0: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e  action.  ** coun
21d0: 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20  ter.  This test 
21e0: 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64  is made to avoid
21f0: 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69   new problems si
2200: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
2210: 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20  * one described 
2220: 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e  by ticket #3584.
2230: 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   .  */.  unsigne
2240: 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72  d char transCntr
2250: 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20  Chng;   /* True 
2260: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2270: 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on counter chang
2280: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
2290: 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b 20   char dbUpdate; 
22a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
22b0: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61  f any part of da
22c0: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
22d0: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
22e0: 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57  d char inNormalW
22f0: 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  rite;   /* True 
2300: 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77  if in a normal w
2310: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a  rite operation *
2320: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
2330: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2340: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
2350: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2360: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2370: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
2380: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
2390: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
23a0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
23b0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
23c0: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
23d0: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
23e0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
23f0: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2400: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72  the unixFile.ctr
2410: 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a  lFlags bitmask:.
2420: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2430: 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20  ILE_EXCL        
2440: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
2450: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
2460: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
2470: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2480: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78  E_RDONLY      0x
2490: 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  02     /* Connec
24a0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
24b0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
24c0: 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
24d0: 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65  L 0x04     /* Pe
24e0: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
24f0: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
2500: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2510: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  YNC.# define UNI
2520: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2530: 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72   0x08     /* Dir
2540: 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64  ectory sync need
2550: 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ed */.#else.# de
2560: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2570: 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65  RSYNC    0x00.#e
2580: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49  ndif.#define UNI
2590: 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  XFILE_PSOW      
25a0: 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51    0x10     /* SQ
25b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
25c0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
25d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
25e0: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
25f0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
2600: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
2610: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
2620: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
2630: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
2640: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
2650: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
2660: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
2670: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2680: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2690: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
26a0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
26b0: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
26c0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
26d0: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
26e0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
26f0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
2700: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
2710: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
2720: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
2730: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
2740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
2750: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
2760: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
2770: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
2780: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2790: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
27a0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
27b0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
27c0: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
27d0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
27e0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
27f0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
2800: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
2810: 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  _.#define SQLITE
2820: 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43  _ENABLE_SUPERLOC
2830: 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  K 1.#endif..#if 
2840: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55  SQLITE_ENABLE_SU
2850: 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65  PERLOCK.#include
2860: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e   "sqlite3.h".#in
2870: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
2880: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
2890: 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  t.h>../*.** A st
28a0: 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c 65  ructure to colle
28b0: 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65  ct a busy-handle
28c0: 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 61  r callback and a
28d0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63 6f  rgument and a co
28e0: 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75  unt.** of the nu
28f0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69 74  mber of times it
2900: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65   has been invoke
2910: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70  d..*/.struct Sup
2920: 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20 69  erlockBusy {.  i
2930: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
2940: 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 2f  *,int);        /
2950: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
2960: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
2970: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
2980: 75 73 79 41 72 67 3b 20 20 20 20 20 20 20 20 20  usyArg;         
2990: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29a0: 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20   arg to pass to 
29b0: 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  xBusy */.  int n
29c0: 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20  Busy;           
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29e0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78 42  mber of times xB
29f0: 75 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e 76  usy has been inv
2a00: 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  oked */.};.typed
2a10: 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72 6c  ef struct Superl
2a20: 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f 63  ockBusy Superloc
2a30: 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  kBusy;../*.** An
2a40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2a60: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2a70: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
2a80: 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e 20  e.** superlock. 
2a90: 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c  The opaque handl
2aa0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2ab0: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
2ac0: 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74 75  ock() is.** actu
2ad0: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
2ae0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
2af0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
2b00: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72  .*/.struct Super
2b10: 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33  lock {.  sqlite3
2b20: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2b40: 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64  base handle used
2b50: 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a 20   to lock db */. 
2b60: 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20 20   int bWal;      
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20 69   /* True if db i
2b90: 73 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  s a WAL database
2ba0: 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73   */.};.typedef s
2bb0: 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20  truct Superlock 
2bc0: 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a  Superlock;../*.*
2bd0: 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e 74  * The pCtx point
2be0: 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  er passed to thi
2bf0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63  s function is ac
2c00: 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
2c10: 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c 6f   to a.** Superlo
2c20: 63 6b 42 75 73 79 20 73 74 72 75 63 74 75 72 65  ckBusy structure
2c30: 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  . Invoke the bus
2c40: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
2c50: 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64 0a  on encapsulated.
2c60: 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ** by the struct
2c70: 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ure and return t
2c80: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
2c90: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
2ca0: 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  ckBusyHandler(vo
2cb0: 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55 4e  id *pCtx, int UN
2cc0: 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c 6f  USED){.  Superlo
2cd0: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d 20  ckBusy *pBusy = 
2ce0: 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a  (SuperlockBusy *
2cf0: 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42 75  )pCtx;.  if( pBu
2d00: 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20 72  sy->xBusy==0 ) r
2d10: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2d20: 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28 70  n pBusy->xBusy(p
2d30: 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c 20  Busy->pBusyArg, 
2d40: 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29 3b  pBusy->nBusy++);
2d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2d60: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2d70: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2d80: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2d90: 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 63  e file for .** c
2da0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
2db0: 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
2dc0: 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20 65   or not. If no e
2dd0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
2de0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2df0: 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20 6d  file is in WAL m
2e00: 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20  ode, set *pbWal 
2e10: 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74 75  to true and retu
2e20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
2e30: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69 6e   If it is not in
2e40: 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a   WAL mode, set *
2e50: 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e 0a  pbWal to false..
2e60: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2e70: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
2e80: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2e90: 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75 65   code. The value
2ea0: 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69 73   of *pbWal.** is
2eb0: 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2ec0: 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
2ed0: 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b  ic int superlock
2ee0: 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b 20  IsWal(Superlock 
2ef0: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
2f00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f20: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73  turn Code */.  s
2f30: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2f40: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mt;            /
2f50: 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47 4d  * Compiled PRAGM
2f60: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73  A journal_mode s
2f70: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72  tatement */..  r
2f80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2f90: 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22  are(pLock->db, "
2fa0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
2fb0: 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20 26  nal_mode", -1, &
2fc0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
2fd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
2ff0: 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b 0a  Lock->bWal = 0;.
3000: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
3010: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
3020: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e  Stmt) ){.    con
3030: 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d  st char *zMode =
3040: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
3050: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
3060: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
3070: 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20 73    if( zMode && s
3080: 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33 20  trlen(zMode)==3 
3090: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
30a0: 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64 65  cmp("wal", zMode
30b0: 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
30c0: 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 31   pLock->bWal = 1
30d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
30e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
30f0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d  nalize(pStmt);.}
3100: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
3110: 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 2d  n exclusive shm-
3120: 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62 79  lock on nByte by
3130: 74 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  tes starting at 
3140: 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f 66  offset idx.** of
3150: 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49 66   the file fd. If
3160: 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
3170: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d   be obtained imm
3180: 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b 65  ediately, invoke
3190: 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61 6e  .** the busy-han
31a0: 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68 65  dler until eithe
31b0: 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  r it is obtained
31c0: 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e   or the busy-han
31d0: 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b  dler.** callback
31e0: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 73   returns 0..*/.s
31f0: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
3200: 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  ockShmLock(.  sq
3210: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3230: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
3240: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
3250: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
3260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
3270: 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63 6b  fset of shm-lock
3280: 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20 20   to obtain */.  
3290: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
32c0: 73 65 63 74 69 76 65 20 62 79 74 65 73 20 74 6f  sective bytes to
32d0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65 72   lock */.  Super
32e0: 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20  lockBusy *pBusy 
32f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
3300: 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70 70  sy-handler wrapp
3310: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
3320: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
3330: 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69  (*xShmLock)(sqli
3340: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20  te3_file*, int, 
3350: 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d 3e  int, int) = fd->
3360: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f  pMethods->xShmLo
3370: 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  ck;.  do {.    r
3380: 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64 2c  c = xShmLock(fd,
3390: 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51 4c   idx, nByte, SQL
33a0: 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51 4c  ITE_SHM_LOCK|SQL
33b0: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
33c0: 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  E);.  }while( rc
33d0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
33e0: 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61   superlockBusyHa
33f0: 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70 42  ndler((void *)pB
3400: 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65 74  usy, 0) );.  ret
3410: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3420: 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72   Obtain the extr
3430: 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 64  a locks on the d
3440: 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65 71  atabase file req
3450: 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64 61  uired for WAL da
3460: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76 6f  tabases..** Invo
3470: 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  ke the supplied 
3480: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73 20  busy-handler as 
3490: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
34a0: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
34b0: 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  kWalLock(.  sqli
34c0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
34e0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
34f0: 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61 62  pen on WAL datab
3500: 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f  ase */.  Superlo
3510: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20 20  ckBusy *pBusy   
3520: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79           /* Busy
3530: 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72   handler wrapper
3540: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
3550: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
3580: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
3590: 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20   *fd = 0;       
35a0: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61      /* Main data
35b0: 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
35c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
35d0: 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  ile *p = 0;     
35e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
35f0: 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 6f   to first page o
3600: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
3610: 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
3620: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3630: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
3640: 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ject open on the
3650: 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20 2a   main db file. *
3660: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
3670: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
3680: 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
3690: 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
36a0: 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64  TER, (void *)&fd
36b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
36c0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36d0: 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  rc;..  /* Obtain
36e0: 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 20   the "recovery" 
36f0: 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  lock. Normally, 
3700: 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c  this lock is onl
3710: 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20 20  y obtained by.  
3720: 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e 69  ** clients runni
3730: 6e 67 20 64 61 74 61 62 61 73 65 20 72 65 63 6f  ng database reco
3740: 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 72  very.  .  */.  r
3750: 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d  c = superlockShm
3760: 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 70  Lock(fd, 2, 1, p
3770: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 21  Busy);.  if( rc!
3780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
3790: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a 65  urn rc;..  /* Ze
37a0: 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ro the start of 
37b0: 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65 64  the first shared
37c0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54 68  -memory page. Th
37d0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  is means that an
37e0: 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 74  y.  ** clients t
37f0: 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f 72  hat open read or
3800: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3810: 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f  ons from this po
3820: 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a  int on will.  **
3830: 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65 63   have to run rec
3840: 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70 72 6f  overy before pro
3850: 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20 74  ceeding. Since t
3860: 68 65 79 20 6e 65 65 64 20 74 68 65 20 22 72 65  hey need the "re
3870: 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f 63  covery".  ** loc
3880: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  k that this proc
3890: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
38a0: 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e 65  o do that, no ne
38b0: 77 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  w read or write.
38c0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
38d0: 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70 65  s may now be ope
38e0: 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20 63  ned. Nor can a c
38f0: 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75 6e  heckpoint be run
3900: 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  , for the.  ** s
3910: 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a 2f  ame reason..  */
3920: 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65 74  .  rc = fd->pMet
3930: 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66 64  hods->xShmMap(fd
3940: 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31 2c  , 0, 32*1024, 1,
3950: 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
3960: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
3970: 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
3980: 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33 32  (void *)p, 0, 32
3990: 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  );..  /* Obtain 
39a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
39b0: 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61 64  on all the "read
39c0: 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f 6e  -lock" slots. On
39d0: 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a 20  ce these locks. 
39e0: 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69 74   ** are held, it
39f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3a00: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
3a10: 20 61 63 74 69 76 65 20 72 65 61 64 65 72 2c 20   active reader, 
3a20: 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a 20  writer or .  ** 
3a30: 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c 69  checkpointer cli
3a40: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ents..  */.  rc 
3a50: 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f  = superlockShmLo
3a60: 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45  ck(fd, 3, SQLITE
3a70: 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70 42  _SHM_NLOCK-3, pB
3a80: 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  usy);.  return r
3a90: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
3aa0: 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b 20  ase a superlock 
3ab0: 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62 61  held on a databa
3ac0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
3ad0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
3ae0: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
3af0: 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  n must have been
3b00: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
3b10: 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
3b20: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64 65   to.** sqlite3de
3b30: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e 0a  mo_superlock()..
3b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3b50: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
3b60: 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c 6f  unlock(void *pLo
3b70: 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b  ck){.  Superlock
3b80: 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b   *p = (Superlock
3b90: 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20   *)pLock;.  if( 
3ba0: 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 69  p->bWal ){.    i
3bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3bd0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
3be0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
3bf0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
3c00: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
3c10: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 73  EXCLUSIVE;.    s
3c20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
3c30: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
3c40: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
3c50: 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  ol(p->db, "main"
3c60: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  , SQLITE_FCNTL_F
3c70: 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f  ILE_POINTER, (vo
3c80: 69 64 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69  id *)&fd);.    i
3c90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3ca0: 20 29 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d   ){.      fd->pM
3cb0: 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
3cc0: 28 66 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73  (fd, 2, 1, flags
3cd0: 29 3b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65  );.      fd->pMe
3ce0: 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28  thods->xShmLock(
3cf0: 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48  fd, 3, SQLITE_SH
3d00: 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73  M_NLOCK-3, flags
3d10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
3d20: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
3d30: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  db);.  sqlite3_f
3d40: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
3d50: 20 4f 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c   Obtain a superl
3d60: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
3d70: 61 73 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66  ase file identif
3d80: 69 65 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73  ied by zPath, us
3d90: 69 6e 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69  ing the.** locki
3da0: 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
3db0: 6f 76 69 64 65 64 20 62 79 20 56 46 53 20 7a 56  ovided by VFS zV
3dc0: 66 73 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  fs. If successfu
3dd0: 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a  l, SQLITE_OK is.
3de0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
3df0: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
3e00: 2a 70 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c  *ppLock is popul
3e10: 61 74 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61  ated with an opa
3e20: 71 75 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68  que handle.** th
3e30: 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 77  at may be used w
3e40: 69 74 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  ith sqlite3demo_
3e50: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f  superunlock() to
3e60: 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   release the loc
3e70: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  k..**.** If an e
3e80: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
3e90: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30  Lock is set to 0
3ea0: 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65   and an SQLite e
3eb0: 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65  rror code .** (e
3ec0: 2e 67 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29  .g. SQLITE_BUSY)
3ed0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
3ee0: 0a 2a 2a 20 49 66 20 61 20 72 65 71 75 69 72 65  .** If a require
3ef0: 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  d lock cannot be
3f00: 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69   obtained immedi
3f10: 61 74 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42  ately and the xB
3f20: 75 73 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  usy parameter.**
3f30: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
3f40: 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  n is not NULL, t
3f50: 68 65 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76  hen xBusy is inv
3f60: 6f 6b 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  oked in the same
3f70: 20 77 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73   way.** as a bus
3f80: 79 2d 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74  y-handler regist
3f90: 65 72 65 64 20 77 69 74 68 20 53 51 4c 69 74 65  ered with SQLite
3fa0: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f   (using sqlite3_
3fb0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a  busy_handler()).
3fc0: 2a 2a 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  ** until either 
3fd0: 74 68 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20  the lock can be 
3fe0: 6f 62 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20  obtained or the 
3ff0: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
4000: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
4010: 20 30 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22   0 (indicating "
4020: 67 69 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74  give up")..*/.st
4030: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
4040: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a  demo_superlock(.
4050: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
4060: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
4070: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74    /* Path to dat
4080: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f  abase file to lo
4090: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
40a0: 61 72 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20  ar *zVfs,       
40b0: 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
40c0: 6f 20 75 73 65 20 74 6f 20 61 63 63 65 73 73 20  o use to access 
40d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
40e0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c     /* Additional
4110: 20 66 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   flags to pass t
4120: 6f 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  o sqlite3_open_v
4130: 32 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  2 */.  int (*xBu
4140: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20  sy)(void*,int), 
4150: 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68         /* Busy h
4160: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
4170: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
4180: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
4190: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
41a0: 61 72 67 20 66 6f 72 20 62 75 73 79 20 68 61 6e  arg for busy han
41b0: 64 6c 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  dler */.  void *
41c0: 2a 70 70 4c 6f 63 6b 20 20 20 20 20 20 20 20 20  *ppLock         
41d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
41e0: 3a 20 43 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  : Context to pas
41f0: 73 20 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63 6b  s to superunlock
4200: 28 29 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65 72  () */.){.  Super
4210: 6c 6f 63 6b 42 75 73 79 20 62 75 73 79 20 3d 20  lockBusy busy = 
4220: 7b 30 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42 75  {0, 0, 0}; /* Bu
4230: 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70  sy handler wrapp
4240: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
4250: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4270: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
4280: 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70 4c  .  Superlock *pL
4290: 6f 63 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d 20  ock;..  pLock = 
42a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
42b0: 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29  izeof(Superlock)
42c0: 29 3b 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  );.  if( !pLock 
42d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
42e0: 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
42f0: 70 4c 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  pLock, 0, sizeof
4300: 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a 20  (Superlock));.. 
4310: 20 2f 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62   /* Open a datab
4320: 61 73 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74 68  ase handle on th
4330: 65 20 66 69 6c 65 20 74 6f 20 73 75 70 65 72 6c  e file to superl
4340: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ock. */.  rc = s
4350: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
4360: 20 20 20 20 20 20 7a 50 61 74 68 2c 20 26 70 4c        zPath, &pL
4370: 6f 63 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  ock->db, SQLITE_
4380: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
4390: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
43a0: 45 7c 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20 20  E|flags, zVfs.  
43b0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c  );..  /* Install
43c0: 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20   a busy-handler 
43d0: 61 6e 64 20 65 78 65 63 75 74 65 20 61 20 42 45  and execute a BE
43e0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 2e 20 49  GIN EXCLUSIVE. I
43f0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20  f this is not.  
4400: 2a 2a 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  ** a WAL databas
4410: 65 2c 20 74 68 69 73 20 69 73 20 61 6c 6c 20 77  e, this is all w
4420: 65 20 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20 0a  e need to do.  .
4430: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61 70    **.  ** A wrap
4440: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  per function is 
4450: 75 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74  used to invoke t
4460: 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
4470: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
4480: 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 20  registering the 
4490: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
44a0: 63 74 69 6f 6e 20 73 75 70 70 6c 69 65 64 20 62  ction supplied b
44b0: 79 20 74 68 65 20 75 73 65 72 20 64 69 72 65 63  y the user direc
44c0: 74 6c 79 0a 20 20 2a 2a 20 77 69 74 68 20 53 51  tly.  ** with SQ
44d0: 4c 69 74 65 2e 20 54 68 69 73 20 69 73 20 62 65  Lite. This is be
44e0: 63 61 75 73 65 20 74 68 65 20 73 61 6d 65 20 62  cause the same b
44f0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
4500: 74 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a 2a  tion may be.  **
4510: 20 69 6e 76 6f 6b 65 64 20 64 69 72 65 63 74 6c   invoked directl
4520: 79 20 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e 20  y later on when 
4530: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62  attempting to ob
4540: 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c  tain the extra l
4550: 6f 63 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  ocks.  ** requir
4560: 65 64 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ed in WAL mode. 
4570: 42 79 20 75 73 69 6e 67 20 74 68 65 20 77 72 61  By using the wra
4580: 70 70 65 72 2c 20 77 65 20 61 72 65 20 61 62 6c  pper, we are abl
4590: 65 20 74 6f 20 67 75 61 72 61 6e 74 65 65 0a 20  e to guarantee. 
45a0: 20 2a 2a 20 74 68 61 74 20 74 68 65 20 22 6e 42   ** that the "nB
45b0: 75 73 79 22 20 69 6e 74 65 67 65 72 20 70 61 72  usy" integer par
45c0: 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
45d0: 20 74 68 65 20 75 73 65 72 73 20 62 75 73 79 2d   the users busy-
45e0: 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65 70  handler.  ** rep
45f0: 72 65 73 65 6e 74 73 20 74 68 65 20 74 6f 74 61  resents the tota
4600: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 73 79  l number of busy
4610: 2d 68 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61 74  -handler invocat
4620: 69 6f 6e 73 20 6d 61 64 65 20 77 69 74 68 69 6e  ions made within
4630: 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  .  ** this call 
4640: 74 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73  to sqlite3demo_s
4650: 75 70 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63 6c  uperlock(), incl
4660: 75 64 69 6e 67 20 61 6e 79 20 6d 61 64 65 20 64  uding any made d
4670: 75 72 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 22  uring the.  ** "
4680: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
4690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
46a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
46b0: 20 20 62 75 73 79 2e 78 42 75 73 79 20 3d 20 78    busy.xBusy = x
46c0: 42 75 73 79 3b 0a 20 20 20 20 62 75 73 79 2e 70  Busy;.    busy.p
46d0: 42 75 73 79 41 72 67 20 3d 20 70 42 75 73 79 41  BusyArg = pBusyA
46e0: 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rg;.    sqlite3_
46f0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c 6f  busy_handler(pLo
4700: 63 6b 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f 63  ck->db, superloc
4710: 6b 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 28 76  kBusyHandler, (v
4720: 6f 69 64 20 2a 29 26 62 75 73 79 29 3b 0a 20 20  oid *)&busy);.  
4730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
4740: 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22  xec(pLock->db, "
4750: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
4760: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
4770: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 42 45 47  .  /* If the BEG
4780: 49 4e 20 45 58 43 4c 55 53 49 56 45 20 77 61 73  IN EXCLUSIVE was
4790: 20 65 78 65 63 75 74 65 64 20 73 75 63 63 65 73   executed succes
47a0: 73 66 75 6c 6c 79 20 61 6e 64 20 74 68 69 73 20  sfully and this 
47b0: 69 73 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64 61  is a WAL.  ** da
47c0: 74 61 62 61 73 65 2c 20 63 61 6c 6c 20 73 75 70  tabase, call sup
47d0: 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29 20  erlockWalLock() 
47e0: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78  to obtain the ex
47f0: 74 72 61 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  tra locks requir
4800: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65  ed.  ** to preve
4810: 6e 74 20 72 65 61 64 65 72 73 2c 20 77 72 69 74  nt readers, writ
4820: 65 72 73 20 61 6e 64 2f 6f 72 20 63 68 65 63 6b  ers and/or check
4830: 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20 61 63  pointers from ac
4840: 63 65 73 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  cessing the.  **
4850: 20 64 62 20 77 68 69 6c 65 20 74 68 69 73 20 70   db while this p
4860: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
4870: 67 20 74 68 65 20 73 75 70 65 72 6c 6f 63 6b 2e  g the superlock.
4880: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f 72  .  **.  ** Befor
4890: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
48a0: 20 57 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d 6d   WAL locks, comm
48b0: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
48c0: 6f 6e 20 73 74 61 72 74 65 64 20 61 62 6f 76 65  on started above
48d0: 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74 68  .  ** to drop th
48e0: 65 20 57 41 4c 20 72 65 61 64 20 61 6e 64 20 77  e WAL read and w
48f0: 72 69 74 65 20 6c 6f 63 6b 73 20 63 75 72 72 65  rite locks curre
4900: 6e 74 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65 72  ntly held. Other
4910: 77 69 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20 6e  wise, the.  ** n
4920: 65 77 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61 79  ew WAL locks may
4930: 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 74   conflict with t
4940: 68 65 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69  he old..  */.  i
4950: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4960: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
4970: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75 70  TE_OK==(rc = sup
4980: 65 72 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f 63  erlockIsWal(pLoc
4990: 6b 29 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62 57  k)) && pLock->bW
49a0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
49b0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c   sqlite3_exec(pL
49c0: 6f 63 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54  ock->db, "COMMIT
49d0: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
49e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
49f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
4a00: 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57 61  rc = superlockWa
4a10: 6c 4c 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62 2c  lLock(pLock->db,
4a20: 20 26 62 75 73 79 29 3b 0a 20 20 20 20 20 20 7d   &busy);.      }
4a30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4a40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4a50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65  ){.    sqlite3de
4a60: 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70  mo_superunlock(p
4a70: 4c 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c 6f  Lock);.    *ppLo
4a80: 63 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ck = 0;.  }else{
4a90: 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70  .    *ppLock = p
4aa0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
4ab0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 20  urn rc;.}../* A 
4ac0: 63 6f 72 72 75 70 74 20 44 42 20 77 6f 6e 27 74  corrupt DB won't
4ad0: 20 77 6f 72 6b 20 77 69 74 68 20 74 68 65 20 73   work with the s
4ae0: 71 6c 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67  ql-based locking
4af0: 20 61 74 74 65 6d 70 74 2c 20 67 72 61 62 20 61   attempt, grab a
4b00: 6e 20 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  n .** exclusive 
4b10: 6c 6f 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  lock and return 
4b20: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
4b30: 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20  ITE_BUSY if the 
4b40: 6c 6f 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20 72  lock fails .** r
4b50: 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
4b60: 6e 74 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68 65  nt lock level he
4b70: 6c 64 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66 69  ld on sqlite3_fi
4b80: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
4b90: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
4ba0: 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73  erlock_corrupt(s
4bb0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
4bc0: 20 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65   int eTargetFile
4bd0: 4c 6f 63 6b 2c 20 69 6e 74 20 2a 70 46 69 6c 65  Lock, int *pFile
4be0: 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
4bf0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
4c00: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
4c10: 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46 69   eFileLock = pFi
4c20: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
4c30: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4c40: 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 65 46  _OK;.  .  if( eF
4c50: 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74 46  ileLock<eTargetF
4c60: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
4c70: 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
4c80: 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51  od->xLock(id, SQ
4c90: 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
4ca0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  );.  }.  if( !rc
4cb0: 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54   && eFileLock<eT
4cc0: 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b  argetFileLock ){
4cd0: 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
4ce0: 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
4cf0: 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
4d00: 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a  EXCLUSIVE);.  }.
4d10: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
4d20: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
4d30: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
4d40: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
4d50: 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
4d60: 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 29  k(id, eFileLock)
4d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
4d80: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 20  rn rc;.  }.  if 
4d90: 28 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20  (pFileLock) {.  
4da0: 20 20 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65    *pFileLock = e
4db0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
4dc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4dd0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
4de0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
4df0: 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
4e00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
4e10: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
4e20: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
4e30: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
4e40: 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
4e50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
4e60: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
4e70: 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
4e80: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46  k ){.    rc = pF
4e90: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
4ea0: 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  nlock(id, SQLITE
4eb0: 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20  _LOCK_SHARED);. 
4ec0: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
4ed0: 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c  eFileLock > eFil
4ee0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  eLock ){.    int
4ef0: 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c   unlockRC = pFil
4f00: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
4f10: 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
4f20: 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  OCK_NONE);.    i
4f30: 66 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c  f (!rc) rc = unl
4f40: 6f 63 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65 74  ockRC;.  }.  ret
4f50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
4f60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
4f70: 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f 0a  LE_SUPERLOCK */.
4f80: 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ../*.** Differen
4f90: 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64  t Unix systems d
4fa0: 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e  eclare open() in
4fb0: 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e   different ways.
4fc0: 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70    Same use.** op
4fd0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
4fe0: 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68  nt,mode_t).  Oth
4ff0: 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e  ers use open(con
5000: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e  st char*,int,...
5010: 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  )..** The differ
5020: 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  ence is importan
5030: 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70  t when using a p
5040: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75  ointer to the fu
5050: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
5060: 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20  e safest way to 
5070: 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72  deal with the pr
5080: 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61  oblem is to alwa
5090: 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70  ys use this wrap
50a0: 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77  per.** which alw
50b0: 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65  ays has the same
50c0: 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e   well-defined in
50d0: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
50e0: 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e  ic int posixOpen
50f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
5100: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  le, int flags, i
5110: 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75  nt mode){.  retu
5120: 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66  rn open(zFile, f
5130: 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a  lags, mode);.}..
5140: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5150: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
5160: 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
5170: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e  (const char*, in
5180: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  t*);../*.** Many
5190: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
51a0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
51b0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
51c0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
51d0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
51e0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
51f0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
5200: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
5210: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
5220: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
5230: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
5240: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
5250: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
5260: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
5270: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
5280: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
5290: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
52a0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
52b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
52d0: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d  ame of the sytem
52e0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
52f0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
5300: 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72  Current; /* Curr
5310: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
5320: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
5330: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
5340: 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20  l_ptr pDefault; 
5350: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
5360: 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d   */.} aSyscall[]
5370: 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c   = {.  { "open",
5380: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
5390: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
53a0: 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a  sixOpen,  0  },.
53b0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20  #define osOpen  
53c0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
53d0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74  st char*,int,int
53e0: 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43  ))aSyscall[0].pC
53f0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c  urrent)..  { "cl
5400: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ose",        (sq
5410: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5420: 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20  r)close,      0 
5430: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c   },.#define osCl
5440: 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ose     ((int(*)
5450: 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  (int))aSyscall[1
5460: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5470: 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20   "access",      
5480: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5490: 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20 20  l_ptr)access,   
54a0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
54b0: 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69 6e  osAccess    ((in
54c0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
54d0: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,int))aSyscall[2
54e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
54f0: 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20 20   "getcwd",      
5500: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5510: 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20 20  l_ptr)getcwd,   
5520: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5530: 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63 68  osGetcwd    ((ch
5540: 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a  ar*(*)(char*,siz
5550: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d  e_t))aSyscall[3]
5560: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5570: 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  "stat",         
5580: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5590: 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20 20  _ptr)stat,      
55a0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
55b0: 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e 74  sStat      ((int
55c0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
55d0: 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53  struct stat*))aS
55e0: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
55f0: 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  nt)../*.** The D
5600: 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e  JGPP compiler en
5610: 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20  vironment looks 
5620: 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78  mostly like Unix
5630: 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b  , but it.** lack
5640: 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79  s the fcntl() sy
5650: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72  stem call.  So r
5660: 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20  edefine fcntl() 
5670: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a  to be something.
5680: 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73  ** that always s
5690: 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d  ucceeds.  This m
56a0: 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e  eans that lockin
56b0: 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  g does not occur
56c0: 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e   under.** DJGPP.
56d0: 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20    But it is DOS 
56e0: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
56f0: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
5700: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22   __DJGPP__.  { "
5710: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 30  fstat",        0
5720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5730: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5740: 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20  osFstat(a,b,c)  
5750: 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20    0.#else     . 
5760: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
5770: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5780: 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20  all_ptr)fstat,  
5790: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
57a0: 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28 28  e osFstat     ((
57b0: 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63  int(*)(int,struc
57c0: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
57d0: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[5].pCurrent).#
57e0: 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75  endif..  { "ftru
57f0: 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ncate",    (sqli
5800: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5810: 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d  ftruncate,  0  }
5820: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75  ,.#define osFtru
5830: 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ncate ((int(*)(i
5840: 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  nt,off_t))aSysca
5850: 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[6].pCurrent).
5860: 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20  .  { "fcntl",   
5870: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5880: 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c  scall_ptr)fcntl,
5890: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
58a0: 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20  ine osFcntl     
58b0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74  ((int(*)(int,int
58c0: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37  ,...))aSyscall[7
58d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
58e0: 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20 20   "read",        
58f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5900: 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20 20  l_ptr)read,     
5910: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5920: 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73 73  osRead      ((ss
5930: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
5940: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
5950: 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29  all[8].pCurrent)
5960: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
5970: 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49  E_PREAD) || SQLI
5980: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
5990: 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65  G_STYLE.  { "pre
59a0: 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ad",        (sql
59b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
59c0: 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20 20  )pread,      0  
59d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
59e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
59f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5a00: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5a10: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
5a20: 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20 28  ne osPread     (
5a30: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5a40: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
5a50: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  _t))aSyscall[9].
5a60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5a70: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
5a80: 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34  64).  { "pread64
5a90: 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ",      (sqlite3
5aa0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
5ab0: 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23  ad64,    0  },.#
5ac0: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36  else.  { "pread6
5ad0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
5ae0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5af0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5b00: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
5b10: 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73 69  sPread64   ((ssi
5b20: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
5b30: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
5b40: 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75  aSyscall[10].pCu
5b50: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69  rrent)..  { "wri
5b60: 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  te",        (sql
5b70: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5b80: 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20  )write,      0  
5b90: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  },.#define osWri
5ba0: 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  te     ((ssize_t
5bb0: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
5bc0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
5bd0: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
5be0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5bf0: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
5c00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
5c10: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
5c20: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73  write",       (s
5c30: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5c40: 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20 30  tr)pwrite,     0
5c50: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
5c60: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
5c70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5c80: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
5c90: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
5ca0: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20  fine osPwrite   
5cb0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
5cc0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
5cd0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70    aSyscall[12].p
5d00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
5d10: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
5d20: 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34  4).  { "pwrite64
5d30: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
5d40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69  syscall_ptr)pwri
5d50: 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65  te64,   0  },.#e
5d60: 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36  lse.  { "pwrite6
5d70: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
5d80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
5d90: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
5da0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
5db0: 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69 7a  Pwrite64  ((ssiz
5dc0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
5dd0: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66   void*,size_t,of
5de0: 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20  f_t))\.         
5df0: 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63             aSysc
5e00: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
5e10: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  )..#if SQLITE_EN
5e20: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
5e30: 4c 45 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c  LE.  { "fchmod",
5e40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5e50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d  syscall_ptr)fchm
5e60: 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  od,     0  },.#e
5e70: 6c 73 65 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  lse.  { "fchmod"
5e80: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
5e90: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
5ea0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
5eb0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
5ec0: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
5ed0: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
5ee0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
5ef0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5f00: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
5f10: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
5f20: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
5f30: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
5f40: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
5f50: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
5f60: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
5f70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
5f80: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
5f90: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5fa0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5fb0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
5fc0: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
5fd0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
5fe0: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
5ff0: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
6000: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
6010: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6020: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
6030: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
6040: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
6050: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
6060: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
6070: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
6080: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
6090: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
60a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
60b0: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
60c0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
60d0: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
60e0: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
60f0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
6100: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
6110: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
6120: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
6130: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6140: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
6150: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
6160: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
6170: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
6180: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
6190: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
61a0: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
61b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
61c0: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
61d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
61e0: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
61f0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
6200: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
6210: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
6220: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
6230: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
6240: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
6250: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
6260: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
6270: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
6280: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
6290: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
62a0: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
62b0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
62c0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
62d0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
62e0: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
62f0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
6300: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
6310: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
6320: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6330: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
6340: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
6350: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
6360: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
6370: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
6380: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
6390: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
63a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
63b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
63c0: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
63d0: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
63e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
63f0: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
6400: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
6410: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
6420: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
6430: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6440: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6450: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
6460: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6470: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
6480: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
6490: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
64a0: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
64b0: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
64c0: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
64d0: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
64e0: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
64f0: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
6500: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6510: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
6520: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6530: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6540: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
6550: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6560: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
6570: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
6580: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
6590: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
65a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
65b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
65c0: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
65d0: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
65e0: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
65f0: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
6600: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
6610: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6620: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
6630: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
6640: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
6650: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6660: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6670: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6680: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
6690: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
66a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
66b0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
66c0: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
66d0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
66e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
66f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6700: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
6710: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
6720: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
6730: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6740: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6750: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
6760: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
6770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
67a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
67b0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
67c0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
67d0: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
67e0: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
67f0: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
6800: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
6810: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
6820: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
6830: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
6840: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
6850: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
6860: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
6870: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6880: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6890: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
68a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
68b0: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
68c0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
68d0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
68e0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
68f0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6900: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6910: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6920: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6930: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6940: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6950: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6960: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6970: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6980: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6990: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
69a0: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
69b0: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
69c0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
69d0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
69e0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
69f0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
6a00: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
6a10: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
6a20: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
6a30: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
6a40: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
6a50: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6a60: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
6a70: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
6a80: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
6a90: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
6aa0: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
6ab0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
6ac0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
6ad0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6ae0: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
6af0: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
6b00: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6b10: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6b20: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
6b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6b40: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
6b50: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
6b60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
6b70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6b80: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
6b90: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
6ba0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
6bb0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  0;.}../*.** Retr
6bc0: 79 20 6f 70 65 6e 28 29 20 63 61 6c 6c 73 20 74  y open() calls t
6bd0: 68 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20  hat fail due to 
6be0: 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20  EINTR.*/.static 
6bf0: 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  int robust_open(
6c00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
6c10: 6e 74 20 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20  nt f, int m){.  
6c20: 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
6c30: 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29   = osOpen(z,f,m)
6c40: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
6c50: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
6c60: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6c70: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
6c80: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
6c90: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
6ca0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
6cb0: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
6cc0: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
6cd0: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
6ce0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
6cf0: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
6d00: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
6d10: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
6d20: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
6d30: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
6d40: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
6d50: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
6d60: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
6d70: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
6d80: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
6d90: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
6da0: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
6db0: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
6dc0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
6dd0: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
6de0: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
6df0: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
6e00: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6e10: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
6e20: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
6e30: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
6e40: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
6e50: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
6e60: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
6e70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6e80: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
6e90: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
6ea0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
6eb0: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
6ec0: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
6ed0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
6ee0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
6ef0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
6f00: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6f10: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
6f20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6f30: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
6f40: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
6f50: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
6f60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6f70: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
6f80: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6f90: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
6fa0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
6fb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6fc0: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
6fd0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
6fe0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
6ff0: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
7000: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
7010: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
7020: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
7030: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
7040: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
7050: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
7060: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
7070: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
7080: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7090: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
70a0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
70b0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
70c0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
70d0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
70e0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
70f0: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
7100: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
7110: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
7120: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
7130: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
7140: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
7150: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
7160: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
7170: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
7180: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
7190: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
71a0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
71b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
71c0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
71d0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
71e0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
71f0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
7200: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
7210: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
7220: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
7230: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
7240: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
7250: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
7260: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
7270: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
7280: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
7290: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
72a0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
72b0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
72c0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
72d0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
72e0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
72f0: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
7300: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
7310: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
7320: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
7330: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
7340: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
7350: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
7360: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
7370: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
7380: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
7390: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
73a0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
73b0: 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c   s = osFcntl(fd,
73c0: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
73d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
73e0: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
73f0: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
7400: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
7410: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
7420: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
7430: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
7440: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
7450: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
7460: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
7470: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
7480: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
7490: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
74a0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
74b0: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
74c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
74d0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
74e0: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
74f0: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
7500: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
7510: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
7520: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
7530: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
7540: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
7550: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
7560: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
7570: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
7580: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
7590: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
75a0: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
75b0: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
75c0: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
75d0: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
75e0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
75f0: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
7600: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
7610: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
7620: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
7630: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
7640: 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20  ETLK, &l2);.    
7650: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
7660: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
7670: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
7680: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
7690: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  2.l_type==F_WRLC
76a0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
76b0: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20   = "WRLCK";.    
76c0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
76d0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
76e0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55        zType = "U
76f0: 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  NLCK";.    }else
7700: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7710: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
7720: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
7730: 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65  f("fcntl-failure
7740: 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25  -reason: %s %d %
7750: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %d\n",.       
7760: 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c  zType, (int)l2.l
7770: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e  _start, (int)l2.
7780: 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c  l_len, (int)l2.l
7790: 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72  _pid);.  }.  err
77a0: 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b  no = savedErrno;
77b0: 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23  .  return s;.}.#
77c0: 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64  undef osFcntl.#d
77d0: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f  efine osFcntl lo
77e0: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
77f0: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
7800: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
7810: 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20  try ftruncate() 
7820: 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
7830: 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a  due to EINTR.*/.
7840: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
7850: 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20  t_ftruncate(int 
7860: 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  h, sqlite3_int64
7870: 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   sz){.  int rc;.
7880: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
7890: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
78a0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
78b0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
78c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
78d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78e0: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
78f0: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
7900: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
7910: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
7920: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
7930: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
7940: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
7950: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
7960: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
7970: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
7980: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
7990: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
79a0: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
79b0: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
79c0: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
79d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
79e0: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
79f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
7a00: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
7a10: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
7a20: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
7a30: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
7a40: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
7a50: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
7a60: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
7a70: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
7a80: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
7a90: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
7aa0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
7ab0: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
7ac0: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
7ad0: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
7ae0: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66  osixError) {.#if
7af0: 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70   0.  /* At one p
7b00: 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77  oint this code w
7b10: 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64  as not commented
7b20: 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c   out. In theory,
7b30: 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
7b40: 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  * should never b
7b50: 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66  e hit, as this f
7b60: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
7b70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
7b80: 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69  ter.  ** a locki
7b90: 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ng-related funct
7ba0: 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28  ion (i.e. fcntl(
7bb0: 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20  )) has returned 
7bc0: 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20  non-zero with.  
7bd0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
7be0: 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72  errno as the fir
7bf0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  st argument. Sin
7c00: 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  ce a system call
7c10: 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a   has failed,.  *
7c20: 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62  * errno should b
7c30: 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a  e non-zero..  **
7c40: 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68  .  ** Despite th
7c50: 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61  is, if errno rea
7c60: 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20  lly is zero, we 
7c70: 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74  still don't want
7c80: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
7c90: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73  SQLITE_OK. The s
7ca0: 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65  ystem call faile
7cb0: 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51  d, and *some* SQ
7cc0: 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c  Lite error shoul
7cd0: 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67  d be.  ** propag
7ce0: 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ated back to the
7cf0: 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74   caller. Comment
7d00: 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20  ing this branch 
7d10: 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d  out means errno=
7d20: 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  =0.  ** will be 
7d30: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22  handled by the "
7d40: 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62  default:" case b
7d50: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  elow..  */.  cas
7d60: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
7d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
7d80: 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49  if..  case EAGAI
7d90: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
7da0: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
7db0: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
7dc0: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
7dd0: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
7de0: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
7df0: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
7e00: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
7e10: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
7e20: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
7e30: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
7e40: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
7e50: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
7e60: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
7e70: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
7e80: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
7e90: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
7ea0: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
7eb0: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
7ec0: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
7ed0: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
7ee0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
7ef0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
7f00: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
7f10: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
7f20: 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71  UNLOCK) || ..(sq
7f30: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
7f40: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
7f50: 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45  ) ||..(sqliteIOE
7f60: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
7f70: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
7f80: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
7f90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
7fa0: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
7fb0: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
7fc0: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
7fd0: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
7fe0: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
7ff0: 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73  .  /* EDEADLK is
8000: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
8010: 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74  f a call to fcnt
8020: 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d  l(F_SETLKW) is m
8030: 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68  ade. And.  ** th
8040: 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20  is module never 
8050: 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c  makes such a cal
8060: 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20  l. And the code 
8070: 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66  in SQLite itself
8080: 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74   .  ** asserts t
8090: 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  hat SQLITE_IOERR
80a0: 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65  _BLOCKED is neve
80b0: 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20  r returned. For 
80c0: 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20  these reasons.  
80d0: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20  ** this case is 
80e0: 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f  also commented o
80f0: 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65  ut. If the syste
8100: 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f  m does set errno
8110: 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a   to EDEADLK,.  *
8120: 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51  * the default SQ
8130: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63  LITE_IOERR_XXX c
8140: 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ode will be retu
8150: 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  rned. */.#if 0. 
8160: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
8170: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8180: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
8190: 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20  #endif.    .#if 
81a0: 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54  EOPNOTSUPP!=ENOT
81b0: 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f  SUP.  case EOPNO
81c0: 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73  TSUPP: .    /* s
81d0: 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65  omething went te
81e0: 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c  rribly awry, unl
81f0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
8200: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
8210: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
8220: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
8230: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
8240: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
8250: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45  .#endif.#ifdef E
8260: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e  NOTSUP.  case EN
8270: 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69  OTSUP: .    /* i
8280: 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73  nvalid fd, unles
8290: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
82a0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74  stem support int
82b0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
82c0: 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20  hich .     * it 
82d0: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
82e0: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
82f0: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f  endif.  case EIO
8300: 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a  :.  case EBADF:.
8310: 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20    case EINVAL:. 
8320: 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a   case ENOTCONN:.
8330: 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20    case ENODEV:. 
8340: 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63   case ENXIO:.  c
8350: 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64  ase ENOENT:.#ifd
8360: 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20  ef ESTALE       
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8380: 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64   ESTALE is not d
8390: 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69  efined on Interi
83a0: 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63  x systems */.  c
83b0: 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64  ase ESTALE:.#end
83c0: 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53  if.  case ENOSYS
83d0: 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73  :.    /* these s
83e0: 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20  hould force the 
83f0: 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20  client to close 
8400: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63  the file and rec
8410: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20  onnect */.    . 
8420: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
8430: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
8440: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a  r;.  }.}..../***
8450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
84a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
84b0: 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65  egin Unique File
84c0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
84d0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
84e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
84f0: 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f  * On most versio
8500: 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63  ns of unix, we c
8510: 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20  an get a unique 
8520: 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79  ID for a file by
8530: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a   concatenating.*
8540: 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d  * the device num
8550: 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64  ber and the inod
8560: 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74  e number.  But t
8570: 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  his does not wor
8580: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
8590: 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75   On VxWorks, a u
85a0: 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75  nique file id mu
85b0: 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  st be based on t
85c0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
85d0: 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  ename..**.** A p
85e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
85f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
8600: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
8610: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
8620: 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65  a.** unique file
8630: 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20   ID in VxWorks. 
8640: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
8650: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
8660: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63   contains.** a c
8670: 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  opy of the canon
8680: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20  ical filename.  
8690: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
86a0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e  reference count.
86b0: 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74    .** The struct
86c0: 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64  ure is reclaimed
86d0: 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
86e0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
86f0: 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a  it drops to.** z
8700: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ero..**.** There
8710: 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20   are never very 
8720: 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20  many files open 
8730: 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20  at one time and 
8740: 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a  lookups are not.
8750: 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ** a performance
8760: 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20  -critical path, 
8770: 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69  so it is suffici
8780: 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65  ent to put these
8790: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f  .** structures o
87a0: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  n a linked list.
87b0: 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72  .*/.struct vxwor
87c0: 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72  ksFileId {.  str
87d0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
87e0: 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65  d *pNext;  /* Ne
87f0: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  xt in a list of 
8800: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e  them all */.  in
8810: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
8820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8830: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
8840: 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20  ces to this one 
8850: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
8880: 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  the zCanonicalNa
8890: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  me[] string */. 
88a0: 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61   char *zCanonica
88b0: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  lName;         /
88c0: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * Canonical file
88d0: 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  name */.};..#if 
88e0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a  OS_VXWORKS./* .*
88f0: 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c  * All unique fil
8900: 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20  enames are held 
8910: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
8920: 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a   headed by this.
8930: 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a  ** variable:.*/.
8940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
8950: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
8960: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30  orksFileList = 0
8970: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  ;../*.** Simplif
8980: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  y a filename int
8990: 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20  o its canonical 
89a0: 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e  form.** by makin
89b0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
89c0: 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  changes:.**.**  
89d0: 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74  * removing any t
89e0: 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c  railing and dupl
89f0: 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f  icate /.**  * co
8a00: 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a  nvert /./ into j
8a10: 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ust /.**  * conv
8a20: 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65  ert /A/../ where
8a30: 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65   A is any simple
8a40: 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20   name into just 
8a50: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
8a60: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
8a70: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
8a80: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
8a90: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
8aa0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
8ab0: 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65  n z[0..n-1].  Re
8ac0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8ad0: 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  of.** characters
8ae0: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69   in the simplifi
8af0: 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  ed name..*/.stat
8b00: 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69  ic int vxworksSi
8b10: 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20  mplifyName(char 
8b20: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
8b30: 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28  t i, j;.  while(
8b40: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
8b50: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
8b60: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
8b70: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
8b80: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
8b90: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
8ba0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8bb0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
8bc0: 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a  .' && i+2<n && z
8bd0: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
8be0: 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
8bf0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8c10: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
8c20: 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+3<n && z[i+2]
8c30: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d  =='.' && z[i+3]=
8c40: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
8c50: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b  while( j>0 && z[
8c60: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
8c70: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
8c80: 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  j>0 ){ j--; }.  
8c90: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
8ca0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8cc0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
8cd0: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
8ce0: 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
8cf0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69  /*.** Find a uni
8d00: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
8d10: 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75  the given absolu
8d20: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
8d30: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
8d40: 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73  r to the vxworks
8d50: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
8d60: 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20  This pointer is 
8d70: 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69  the unique.** fi
8d80: 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  le ID..**.** The
8d90: 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74   nRef field of t
8da0: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
8db0: 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65   object is incre
8dc0: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  mented before.**
8dd0: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72   the object is r
8de0: 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20  eturned.  A new 
8df0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
8e00: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
8e10: 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ** and added to 
8e20: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
8e30: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
8e40: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
8e50: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
8e60: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
8e70: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
8e80: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
8e90: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e  leId *vxworksFin
8ea0: 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68  dFileId(const ch
8eb0: 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  ar *zAbsoluteNam
8ec0: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  e){.  struct vxw
8ed0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77  orksFileId *pNew
8ee0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61  ;         /* sea
8ef0: 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20  rch key and new 
8f00: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72  file ID */.  str
8f10: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8f20: 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20  d *pCandidate;  
8f30: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
8f40: 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69  over existing fi
8f50: 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  le IDs */.  int 
8f60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62  /* Length of zAb
8f90: 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e  soluteName strin
8fa0: 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
8fb0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d  zAbsoluteName[0]
8fc0: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28  =='/' );.  n = (
8fd0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f  int)strlen(zAbso
8fe0: 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  luteName);.  pNe
8ff0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
9000: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
9010: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
9020: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
9030: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
9040: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
9050: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
9060: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
9070: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
9080: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
9090: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
90a0: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
90b0: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
90c0: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
90d0: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
90e0: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
90f0: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
9100: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
9110: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
9120: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
9130: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
9140: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
9150: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
9160: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
9170: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
9180: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
9190: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
91a0: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
91b0: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
91c0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
91d0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
91e0: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
91f0: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
9200: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
9210: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
9220: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
9230: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
9240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
9250: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
9260: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
9270: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
9280: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
9290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
92a0: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
92b0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
92c0: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
92d0: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
92e0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
92f0: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
9300: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
9310: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
9320: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
9330: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
9340: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
9350: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
9360: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
9370: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
9380: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
9390: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
93a0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
93b0: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
93c0: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
93d0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
93e0: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
93f0: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
9400: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
9410: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9420: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
9430: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
9440: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
9450: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
9460: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
9470: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
9480: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9490: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
94a0: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
94b0: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
94c0: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
94d0: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
94e0: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
94f0: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
9500: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
9510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9520: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
9530: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
9540: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
9550: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
9560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
9570: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
9580: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
9590: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
95a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
95b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
95c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
95d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
95e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
95f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
9600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
9650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9660: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
9670: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
9680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
96a0: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
96b0: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
96c0: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
96d0: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
96e0: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
96f0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
9700: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
9710: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
9720: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
9730: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
9740: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
9750: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
9760: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
9770: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
9780: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
9790: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
97a0: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
97b0: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
97c0: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
97d0: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
97e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
97f0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
9800: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
9810: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
9820: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
9830: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
9840: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
9850: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
9860: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
9870: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
9880: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
9890: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
98a0: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
98b0: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
98c0: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
98d0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
98e0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
98f0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
9900: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
9910: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
9920: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
9930: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
9940: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
9950: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
9960: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
9970: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
9980: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
9990: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
99a0: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
99b0: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
99c0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
99d0: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
99e0: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
99f0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
9a00: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
9a10: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
9a20: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
9a30: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
9a40: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
9a50: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
9a60: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
9a70: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
9a80: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
9a90: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
9aa0: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
9ab0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
9ac0: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
9ad0: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
9ae0: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
9af0: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
9b00: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
9b10: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
9b20: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
9b30: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
9b40: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
9b50: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
9b60: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
9b70: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
9b80: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
9b90: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
9ba0: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
9bb0: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
9bc0: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
9bd0: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
9be0: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
9bf0: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
9c00: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
9c10: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
9c20: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
9c30: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
9c40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
9c50: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
9c60: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
9c70: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
9c80: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
9c90: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
9ca0: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
9cb0: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
9cc0: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
9cd0: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
9ce0: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
9cf0: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
9d00: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
9d10: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
9d20: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
9d30: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
9d40: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
9d50: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
9d60: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
9d70: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
9d80: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
9d90: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
9da0: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
9db0: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
9dc0: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
9dd0: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
9de0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
9df0: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
9e00: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
9e10: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
9e20: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
9e30: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
9e40: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
9e50: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
9e60: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
9e70: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
9e80: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
9e90: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
9ea0: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
9eb0: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
9ec0: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
9ed0: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
9ee0: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
9ef0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
9f00: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
9f10: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
9f20: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
9f30: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
9f40: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
9f50: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
9f60: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
9f70: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
9f80: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
9f90: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
9fa0: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
9fb0: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
9fc0: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
9fd0: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
9fe0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
9ff0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
a000: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
a010: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
a020: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
a030: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
a040: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
a050: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
a060: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
a070: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
a080: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
a090: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
a0a0: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
a0b0: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
a0c0: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
a0d0: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
a0e0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
a0f0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
a100: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
a110: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
a120: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
a130: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
a140: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
a150: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
a160: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
a170: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
a180: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
a190: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
a1a0: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
a1b0: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
a1c0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
a1d0: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
a1e0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
a1f0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
a200: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
a210: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
a220: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
a230: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
a240: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
a250: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
a260: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
a270: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a280: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
a290: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
a2a0: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
a2b0: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
a2c0: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
a2d0: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
a2e0: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
a2f0: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
a300: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
a310: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
a320: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
a330: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
a340: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
a350: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
a360: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
a370: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
a380: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
a390: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
a3a0: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
a3b0: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
a3c0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
a3d0: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
a3e0: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
a3f0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
a400: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
a410: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
a420: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
a430: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
a440: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
a450: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
a460: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
a470: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
a480: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
a490: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
a4a0: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
a4b0: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
a4c0: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
a4d0: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
a4e0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
a4f0: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
a500: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
a510: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
a520: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
a530: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
a540: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
a550: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
a560: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
a570: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
a580: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
a590: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
a5a0: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
a5b0: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
a5c0: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
a5d0: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
a5e0: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
a5f0: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
a600: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
a610: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
a620: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
a630: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
a640: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
a650: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
a660: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
a670: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
a680: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
a690: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
a6a0: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
a6b0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
a6c0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
a6d0: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
a6e0: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
a6f0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
a700: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
a710: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
a720: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
a730: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
a740: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
a750: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
a760: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
a770: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
a780: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
a790: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
a7a0: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
a7b0: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
a7c0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
a7d0: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
a7e0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
a7f0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
a800: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
a810: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
a820: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
a830: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
a840: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
a850: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
a860: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
a870: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
a880: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
a890: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
a8a0: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
a8b0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
a8c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
a8d0: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
a8e0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
a8f0: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
a900: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a910: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
a920: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
a930: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
a940: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
a950: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
a960: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
a970: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
a980: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
a990: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
a9a0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
a9b0: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
a9c0: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a9e0: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
a9f0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
aa00: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
aa10: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
aa20: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
aa30: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
aa40: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
aa50: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
aa60: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
aa70: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
aa80: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
aa90: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
aaa0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
aab0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
aac0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
aad0: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
aae0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
aaf0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
ab00: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
ab10: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
ab20: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
ab30: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
ab40: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
ab50: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
ab60: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
ab70: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
ab80: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
ab90: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
aba0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
abb0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
abc0: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
abd0: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
abe0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
abf0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
ac00: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
ac10: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
ac20: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
ac30: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
ac40: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
ac50: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
ac60: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac80: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
ac90: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
aca0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
acb0: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
acc0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
acd0: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
ace0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
acf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
ad00: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
ad10: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
ad20: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
ad30: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
ad40: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ad60: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
ad70: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
ad80: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
ad90: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
ada0: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
adb0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
adc0: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
add0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
ade0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
adf0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ae00: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
ae10: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
ae20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
ae30: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
ae40: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
ae50: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
ae60: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
ae70: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
ae80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
ae90: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
aea0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
aeb0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
aec0: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
aed0: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
aee0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
aef0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
af00: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
af10: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
af20: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
af30: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
af40: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
af50: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
af60: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
af70: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af90: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
afa0: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
afb0: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
afc0: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
afd0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
afe0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
aff0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
b000: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
b010: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
b020: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
b030: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
b040: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
b050: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
b060: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
b070: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
b080: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
b090: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
b0a0: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
b0b0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
b0c0: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
b0d0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
b0e0: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
b0f0: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
b100: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
b110: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
b120: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
b130: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
b140: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
b150: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
b160: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
b170: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
b180: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
b190: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
b1a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
b1b0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
b1c0: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
b1d0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
b1e0: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
b1f0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
b200: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
b210: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
b220: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
b230: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
b240: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
b250: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
b260: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
b270: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
b280: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
b290: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
b2a0: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68  pen") and the th
b2b0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
b2c0: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a  e-system path,.*
b2d0: 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  * if any..*/.#de
b2e0: 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f  fine unixLogErro
b2f0: 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69  r(a,b,c)     uni
b300: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
b310: 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  a,b,c,__LINE__).
b320: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
b330: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
b340: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
b370: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
b380: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20   char *zFunc,   
b390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
b3a0: 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f  me of OS functio
b3b0: 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f  n that failed */
b3c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b3d0: 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
b3e0: 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20     /* File path 
b3f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b400: 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  error */.  int i
b410: 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Line            
b420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
b430: 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  urce line number
b440: 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63   where error occ
b450: 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68  urred */.){.  ch
b460: 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20  ar *zErr;       
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b480: 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74   Message from st
b490: 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69  rerror() or equi
b4a0: 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  valent */.  int 
b4b0: 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20  iErrno = errno; 
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b4d0: 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72  aved syscall err
b4e0: 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20  or number */..  
b4f0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  /* If this is no
b500: 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  t a threadsafe b
b510: 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52  uild (SQLITE_THR
b520: 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65  EADSAFE==0), the
b530: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73  n use.  ** the s
b540: 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69  trerror() functi
b550: 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  on to obtain the
b560: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
b570: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
b580: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
b590: 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73   errno. Otherwis
b5a0: 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f  e, use strerror_
b5b0: 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53  r()..  */ .#if S
b5c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
b5d0: 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45   && defined(HAVE
b5e0: 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63  _STRERROR_R).  c
b5f0: 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20  har aErr[80];.  
b600: 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20  memset(aErr, 0, 
b610: 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20  sizeof(aErr));. 
b620: 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20   zErr = aErr;.. 
b630: 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f   /* If STRERROR_
b640: 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79  R_CHAR_P (set by
b650: 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74   autoconf script
b660: 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20  s) or __USE_GNU 
b670: 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a  is defined,.  **
b680: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
b690: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
b6a0: 20 74 68 65 20 74 68 65 20 47 4e 55 20 76 65 72   the the GNU ver
b6b0: 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72  sion of strerror
b6c0: 5f 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a 20  _r() that .  ** 
b6d0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
b6e0: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
b6f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72  ntaining the err
b700: 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74  or message. That
b710: 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d   pointer .  ** m
b720: 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72  ay point to aErr
b730: 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f  [], or it may po
b740: 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74  int to some stat
b750: 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77  ic storage somew
b760: 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  here. .  ** Othe
b770: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68  rwise, assume th
b780: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
b790: 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58  ovides the POSIX
b7a0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a   version of .  *
b7b0: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20  * strerror_r(), 
b7c0: 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69  which always wri
b7d0: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
b7e0: 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d  sage into aErr[]
b7f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
b800: 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63  he code incorrec
b810: 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74  tly assumes that
b820: 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58   it is the POSIX
b830: 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73   version that is
b840: 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c  .  ** available,
b850: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
b860: 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65  ge will often be
b870: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
b880: 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67  . Not a.  ** hug
b890: 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72  e problem. Incor
b8a0: 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e  rectly concludin
b8b0: 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76  g that the GNU v
b8c0: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
b8d0: 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20  ble .  ** could 
b8e0: 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75  lead to a segfau
b8f0: 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a  lt though..  */.
b900: 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45  #if defined(STRE
b910: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c  RROR_R_CHAR_P) |
b920: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f  | defined(__USE_
b930: 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23  GNU).  zErr = .#
b940: 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f   endif.  strerro
b950: 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72  r_r(iErrno, aErr
b960: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31  , sizeof(aErr)-1
b970: 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45  );..#elif SQLITE
b980: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a  _THREADSAFE.  /*
b990: 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61   This is a threa
b9a0: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74  dsafe build, but
b9b0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73   strerror_r() is
b9c0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
b9d0: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a  */.  zErr = "";.
b9e0: 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74  #else.  /* Non-t
b9f0: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
ba00: 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e   use strerror().
ba10: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72   */.  zErr = str
ba20: 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23  error(iErrno);.#
ba30: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
ba40: 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45   errcode!=SQLITE
ba50: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61  _OK );.  if( zPa
ba60: 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20  th==0 ) zPath = 
ba70: 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  "";.  sqlite3_lo
ba80: 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
ba90: 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20   "os_unix.c:%d: 
baa0: 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73  (%d) %s(%s) - %s
bab0: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
bac0: 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  iErrno, zFunc, z
bad0: 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a  Path, zErr.  );.
bae0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
baf0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  e;.}../*.** Clos
bb00: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
bb10: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  tor..**.** We as
bb20: 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28  sume that close(
bb30: 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  ) almost always 
bb40: 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20  works, since it 
bb50: 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20  is only in a.** 
bb60: 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63  very sick applic
bb70: 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65  ation or on a ve
bb80: 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d  ry sick platform
bb90: 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66   that it might f
bba0: 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  ail..** If it do
bbb0: 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20  es fail, simply 
bbc0: 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65  leak the file de
bbd0: 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f  scriptor, but do
bbe0: 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f   log the.** erro
bbf0: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  r..**.** Note th
bc00: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  at it is not saf
bc10: 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65  e to retry close
bc20: 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73  () after EINTR s
bc30: 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ince the.** file
bc40: 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68   descriptor migh
bc50: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
bc60: 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e  een reused by an
bc70: 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a  other thread..**
bc80: 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65   So we don't eve
bc90: 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72  n try to recover
bca0: 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20   from an EINTR. 
bcb0: 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72   Just log the er
bcc0: 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20  ror.** and move 
bcd0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
bce0: 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  id robust_close(
bcf0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
bd00: 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65   int h, int line
bd10: 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f  no){.  if( osClo
bd20: 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69  se(h) ){.    uni
bd30: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
bd40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
bd50: 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20  SE, "close",.   
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c      pFile ? pFil
bd80: 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69  e->zPath : 0, li
bd90: 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  neno);.  }.}../*
bda0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
bdb0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
bdc0: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
bdd0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
bde0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
bdf0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
be00: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
be10: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
be20: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
be30: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
be40: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
be50: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
be60: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
be70: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
be80: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
be90: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
bea0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 23  xt = p->pNext;.#
beb0: 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b  if OSCLOSE_CHECK
bec0: 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20  _CLOSE_IOERR.   
bed0: 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64   if( close(p->fd
bee0: 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
bef0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
bf00: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
bf10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
bf20: 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  SE;.      p->pNe
bf30: 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  xt = pError;.   
bf40: 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20     pError = p;. 
bf50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
bf70: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
bf80: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
bf90: 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49  ile, p->fd, __LI
bfa0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74  NE__);.    sqlit
bfb0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e 64  e3_free(p);.#end
bfc0: 69 66 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  if.  }.  pInode-
bfd0: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
bfe0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
bff0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
c000: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
c010: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
c020: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
c030: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
c040: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
c050: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
c060: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
c070: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
c080: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c090: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
c0a0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
c0b0: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78  seInodeInfo(unix
c0c0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
c0d0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
c0e0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
c0f0: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
c100: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
c110: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
c120: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
c130: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
c140: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
c150: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
c160: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c170: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
c180: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
c190: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
c1a0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
c1b0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
c1c0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c1d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
c1e0: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
c1f0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
c200: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
c210: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
c220: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
c230: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
c240: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
c250: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
c260: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
c270: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
c280: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
c290: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c2a0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
c2b0: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
c2c0: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
c2d0: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
c2e0: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
c2f0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
c300: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
c310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
c320: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
c330: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
c340: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
c350: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
c360: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
c370: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
c380: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
c390: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
c3a0: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
c3b0: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
c3c0: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
c3d0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
c3e0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
c3f0: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
c400: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
c410: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
c420: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
c430: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c440: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
c450: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
c460: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
c470: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
c480: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
c490: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
c4a0: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
c4b0: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
c4c0: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
c4d0: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
c4e0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
c4f0: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
c500: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
c510: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
c520: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
c530: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
c560: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
c570: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
c5a0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
c5b0: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
c5c0: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
c5d0: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
c5e0: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
c5f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
c600: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
c610: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
c620: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
c630: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
c640: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
c650: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
c660: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
c670: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
c680: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
c690: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
c6a0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
c6b0: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
c6c0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
c6d0: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
c6e0: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
c6f0: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
c700: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
c710: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
c720: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46  e->h;.  rc = osF
c730: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
c740: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
c750: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
c760: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
c770: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
c780: 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  W.    if( pFile-
c790: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
c7a0: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
c7b0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
c7c0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
c7d0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
c7e0: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
c7f0: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
c800: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
c810: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
c820: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
c830: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
c840: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
c850: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
c860: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
c870: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
c880: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
c890: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
c8a0: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
c8b0: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
c8c0: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
c8d0: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
c8e0: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
c8f0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
c900: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
c910: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
c920: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
c930: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
c940: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
c950: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
c960: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
c970: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
c980: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
c990: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
c9a0: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
c9b0: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
c9c0: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
c9d0: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
c9e0: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
c9f0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
ca00: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
ca10: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
ca20: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
ca30: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
ca40: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
ca50: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
ca60: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
ca70: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
ca80: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
ca90: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
caa0: 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65  do{ rc = osWrite
cab0: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77  (fd, "S", 1); }w
cac0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
cad0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
cae0: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
caf0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cb00: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
cb10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cb20: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
cb30: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
cb40: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
cb50: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
cb60: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
cb70: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
cb80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
cb90: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
cba0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
cbb0: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
cbc0: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
cbd0: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
cbe0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
cbf0: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
cc00: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
cc10: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
cc20: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
cc30: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
cc40: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64  ;.#endif.  pInod
cc50: 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
cc60: 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
cc70: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
cc80: 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  , &pInode->fileI
cc90: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
cca0: 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  )) ){.    pInode
ccb0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
ccc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f  ;.  }.  if( pIno
ccd0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  de==0 ){.    pIn
cce0: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
ccf0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
cd00: 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28  node) );.    if(
cd10: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
cd20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cd30: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
cd40: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
cd50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
cd60: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
cd70: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
cd80: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
cd90: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
cda0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
cdb0: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
cdc0: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
cdd0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
cde0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
cdf0: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
ce00: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
ce10: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
ce20: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
ce30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
ce40: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
ce50: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
ce60: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
ce70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
ce80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ce90: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
cea0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
ceb0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
cec0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
ced0: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
cee0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
cef0: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
cf00: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
cf10: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
cf20: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
cf30: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
cf40: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
cf50: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
cf60: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
cf70: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
cf80: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
cf90: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
cfa0: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
cfb0: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
cfc0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
cfd0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
cfe0: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
cff0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d000: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
d010: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
d020: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d030: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
d040: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
d050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
d060: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
d070: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
d080: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75  rt( pFile );.  u
d090: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
d0a0: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
d0b0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
d0c0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
d0d0: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
d0e0: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
d0f0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
d100: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
d110: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d120: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d130: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
d140: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
d150: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
d160: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
d170: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
d180: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
d190: 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f  #ifndef __DJGPP_
d1a0: 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  _.  if( !reserve
d1b0: 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e  d && !pFile->pIn
d1c0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
d1d0: 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  k ){.    struct 
d1e0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
d1f0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
d200: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
d210: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
d220: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
d230: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
d240: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d250: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
d260: 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65  f( osFcntl(pFile
d270: 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
d280: 6f 63 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f  ock) ){.#if OSLO
d290: 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
d2a0: 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69 6e 74  _IOERR.      int
d2b0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
d2c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d2d0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
d2e0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
d2f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
d300: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
d310: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d320: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d330: 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
d340: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
d350: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
d360: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
d370: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
d380: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c  .#endif.    } el
d390: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
d3a0: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
d3b0: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
d3c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
d3d0: 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61  dif.  .  unixLea
d3e0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
d3f0: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
d400: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e  OCK %d %d %d (un
d410: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
d420: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
d430: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
d440: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
d450: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d460: 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61  Attempt to set a
d470: 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20   system-lock on 
d480: 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20  the file pFile. 
d490: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   The lock is .**
d4a0: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c   described by pL
d4b0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
d4c0: 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e  e pFile was open
d4d0: 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72  ed read/write fr
d4e0: 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68  om unix-excl, th
d4f0: 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b  en the only lock
d500: 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65  .** ever obtaine
d510: 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76  d is an exclusiv
d520: 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69  e lock, and it i
d530: 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74  s obtained exact
d540: 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66  ly once.** the f
d550: 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f  irst time any lo
d560: 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e  ck is attempted.
d570: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
d580: 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a   system locking.
d590: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65  ** operations be
d5a0: 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f  come no-ops.  Lo
d5b0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
d5c0: 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e   still happen in
d5d0: 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20  ternally,.** in 
d5e0: 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e  order to coordin
d5f0: 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65  ate access betwe
d600: 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61  en separate data
d610: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
d620: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
d630: 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c  process, but all
d640: 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64   of that is hand
d650: 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e  led in memory an
d660: 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  d the.** operati
d670: 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  ng system does n
d680: 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a  ot participate..
d690: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d6a0: 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68  ion is a pass-th
d6b0: 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46  rough to fcntl(F
d6c0: 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65  _SETLK) if pFile
d6d0: 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79   is using.** any
d6e0: 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20   VFS other than 
d6f0: 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69  "unix-excl" or i
d700: 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65  f pFile is opene
d710: 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  d on "unix-excl"
d720: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d  .** and is read-
d730: 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f  only..**.** Zero
d740: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
d750: 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74  the call complet
d760: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  es successfully,
d770: 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c   or -1 if a call
d780: 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66  .** to fcntl() f
d790: 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ails. In this ca
d7a0: 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74  se, errno is set
d7b0: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28   appropriately (
d7c0: 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a  by fcntl())..*/.
d7d0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
d7e0: 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  ileLock(unixFile
d7f0: 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20   *pFile, struct 
d800: 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e  flock *pLock, in
d810: 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 6e 74  t nRetry){.  int
d820: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
d830: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
d840: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d850: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
d860: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73  xHeld() );.  ass
d870: 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
d880: 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d  ;.  if( ((pFile-
d890: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
d8a0: 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c  XFILE_EXCL)!=0 |
d8b0: 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  | pInode->bProce
d8c0: 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28  ssLock).   && ((
d8d0: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
d8e0: 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
d8f0: 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  LY)==0).  ){.   
d900: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
d910: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
d920: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
d930: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
d940: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
d950: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
d960: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d970: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
d980: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
d990: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
d9a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d9b0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
d9c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d9d0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
d9e0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
d9f0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
da00: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
da10: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
da20: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
da30: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
da40: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
da50: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
da60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
da70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
da80: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  se{.    int i = 
da90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
daa0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 64 6f 20          .    do 
dab0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  {.      rc = osF
dac0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
dad0: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
dae0: 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20        if( rc && 
daf0: 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 20 20  nRetry ){.      
db00: 20 20 20 75 73 6c 65 65 70 28 31 30 30 20 2a 20     usleep(100 * 
db10: 28 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 7d 0a  (++i));.      }.
db20: 20 20 20 20 7d 77 68 69 6c 65 28 20 21 72 63 20      }while( !rc 
db30: 26 26 20 6e 52 65 74 72 79 2d 2d 20 29 3b 0a 20  && nRetry-- );. 
db40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
db50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
db60: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
db70: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
db80: 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
db90: 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
dba0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
dbb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
dbc0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
dbd0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
dbe0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
dbf0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
dc00: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
dc10: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
dc20: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
dc30: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
dc40: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
dc50: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
dc60: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
dc70: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
dc80: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
dc90: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
dca0: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
dcb0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
dcc0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
dcd0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
dce0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
dcf0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
dd00: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
dd10: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
dd20: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
dd30: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
dd40: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
dd50: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
dd60: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
dd70: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
dd80: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
dd90: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
dda0: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
ddb0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
ddc0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
ddd0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
dde0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
ddf0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
de00: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
de10: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
de20: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
de30: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
de40: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
de50: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
de60: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
de70: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
de80: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
de90: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
dea0: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f   eFileLock){.  /
deb0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
dec0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
ded0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
dee0: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
def0: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
df00: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
df10: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
df20: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
df30: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
df40: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
df50: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
df60: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
df70: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
df80: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
df90: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
dfa0: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
dfb0: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
dfc0: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
dfd0: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
dfe0: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
dff0: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
e000: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
e010: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
e020: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
e030: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
e040: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
e050: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
e060: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
e070: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
e080: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
e090: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
e0a0: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
e0b0: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
e0c0: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
e0d0: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
e0e0: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
e0f0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
e100: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
e110: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
e120: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
e130: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
e140: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
e150: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
e160: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
e170: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
e180: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
e190: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
e1a0: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
e1b0: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
e1c0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
e1d0: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
e1e0: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
e1f0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
e200: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
e210: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
e220: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
e230: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
e240: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
e250: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
e260: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
e270: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
e280: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
e290: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
e2a0: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
e2b0: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
e2c0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
e2d0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
e2e0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
e2f0: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
e300: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
e310: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
e320: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
e330: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
e340: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
e350: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
e360: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
e370: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
e380: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
e390: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
e3a0: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
e3b0: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
e3c0: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
e3d0: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
e3e0: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
e3f0: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
e400: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
e410: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
e420: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
e430: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
e440: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
e450: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
e460: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
e470: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
e480: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
e490: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
e4a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
e4b0: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
e4c0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
e4d0: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
e4e0: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
e4f0: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
e500: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
e510: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
e520: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
e530: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
e540: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
e550: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
e560: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
e570: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
e580: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
e590: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
e5a0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
e5b0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
e5c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
e5d0: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
e5e0: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
e5f0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
e600: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
e610: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
e620: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
e630: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
e640: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
e650: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
e660: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
e670: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
e680: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
e690: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
e6a0: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
e6b0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
e6c0: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
e6d0: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
e6e0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
e6f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e700: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e710: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e720: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
e730: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
e740: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
e750: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
e760: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
e770: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
e780: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
e790: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
e7a0: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
e7b0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
e7c0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
e7d0: 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
e7e0: 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
e7f0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69  ock),.      azFi
e800: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49  leLock(pFile->pI
e810: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
e820: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
e830: 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
e840: 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
e850: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
e860: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
e870: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
e880: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
e890: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
e8a0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
e8b0: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
e8c0: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
e8d0: 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
e8e0: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
e8f0: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
e900: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
e910: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
e920: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
e930: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
e940: 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
e950: 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22   held) (unix)\n"
e960: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
e970: 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
e980: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
e990: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e9a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
e9b0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
e9c0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
e9d0: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  is correct..  **
e9e0: 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
e9f0: 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
ea00: 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
ea10: 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
ea20: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
ea30: 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
ea40: 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
ea50: 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
ea60: 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
ea70: 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
ea80: 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
ea90: 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
eaa0: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
eab0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
eac0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
ead0: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
eae0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
eaf0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
eb00: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
eb10: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
eb20: 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
eb30: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
eb40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
eb50: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
eb60: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
eb70: 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
eb80: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
eb90: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
eba0: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
ebb0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
ebc0: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
ebd0: 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
ebe0: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
ebf0: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
ec00: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
ec10: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
ec20: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
ec30: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
ec40: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
ec50: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
ec60: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
ec70: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
ec80: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
ec90: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e   .          (pIn
eca0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
ecb0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
ecc0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
ecd0: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
ece0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
ecf0: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
ed00: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
ed10: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
ed20: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
ed30: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
ed40: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
ed50: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
ed60: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
ed70: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
ed80: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
ed90: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
eda0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
edb0: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
edc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
edd0: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
ede0: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
edf0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ee00: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
ee10: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ee20: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
ee30: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
ee40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ee50: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
ee60: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
ee70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
ee80: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
ee90: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
eea0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
eeb0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
eec0: 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
eed0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
eee0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
eef0: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  lock;.  }...  /*
ef00: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
ef10: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
ef20: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
ef30: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
ef40: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
ef50: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
ef60: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
ef70: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
ef80: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
ef90: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
efa0: 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   */.  lock.l_len
efb0: 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f   = 1L;.  lock.l_
efc0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
efd0: 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  T;.  if( eFileLo
efe0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
eff0: 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
f000: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
f010: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
f020: 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
f030: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
f040: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65  lock.l_type = (e
f050: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
f060: 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f  _LOCK?F_RDLCK:F_
f070: 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b  WRLCK);.    lock
f080: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
f090: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28  NG_BYTE;.    if(
f0a0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f0b0: 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
f0c0: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
f0d0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
f0e0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f0f0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f100: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f110: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
f120: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f130: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
f140: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f150: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
f160: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
f170: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
f180: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
f190: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
f1a0: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
f1b0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
f1c0: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
f1d0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
f1e0: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
f1f0: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
f200: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
f210: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
f220: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f230: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
f240: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f250: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f260: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
f270: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
f280: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
f290: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
f2a0: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
f2b0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f2c0: 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
f2d0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
f2e0: 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ZE;.    if( unix
f2f0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f300: 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20  &lock, 0) ){.   
f310: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
f320: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
f330: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
f340: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
f350: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
f360: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
f370: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
f380: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
f390: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
f3a0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
f3b0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
f3c0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
f3d0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f3e0: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
f3f0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f400: 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 26 26 20  , &lock, 10) && 
f410: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f420: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
f430: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
f440: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
f450: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
f460: 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53   = errno;.#if OS
f470: 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
f480: 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 72  SY_IOERR.      r
f490: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
f4a0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
f4b0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
f4c0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 23 65 6c  RR_UNLOCK); .#el
f4d0: 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  se.      rc = SQ
f4e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
f4f0: 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  K; .#endif.    }
f500: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
f510: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f520: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
f530: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
f540: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
f550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f560: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
f570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f580: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f590: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
f5a0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
f5b0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
f5c0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
f5d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
f5e0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
f5f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
f600: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
f610: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
f620: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
f630: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
f640: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
f650: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
f660: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
f670: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
f680: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
f690: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
f6a0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
f6b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
f6c0: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
f6d0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
f6e0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
f6f0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
f700: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
f710: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
f720: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
f730: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
f740: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
f750: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
f760: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
f770: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f780: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
f790: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
f7a0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
f7b0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
f7c0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
f7d0: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
f7e0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
f7f0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
f800: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
f810: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
f820: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
f830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
f840: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f850: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f860: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f870: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f880: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
f890: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f8a0: 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20  lock, 0) ){.    
f8b0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f8c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f8d0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
f8e0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
f8f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
f900: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
f910: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
f920: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
f930: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
f940: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
f950: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
f960: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
f970: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
f980: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
f990: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
f9a0: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
f9b0: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
f9c0: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
f9d0: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
f9e0: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
f9f0: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
fa00: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
fa10: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
fa20: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
fa30: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
fa40: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
fa50: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
fa60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fa70: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
fa80: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
fa90: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
faa0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
fab0: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
fac0: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
fad0: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
fae0: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
faf0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
fb00: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
fb10: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
fb20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fb30: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
fb40: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
fb50: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
fb60: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
fb70: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
fb80: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
fb90: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
fba0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
fbb0: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
fbc0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
fbd0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
fbe0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
fbf0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
fc00: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
fc10: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
fc20: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
fc30: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
fc40: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
fc50: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
fc60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
fc70: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
fc80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fc90: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
fca0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
fcb0: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
fcc0: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
fcd0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
fce0: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
fcf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
fd00: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
fd10: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
fd20: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
fd30: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
fd40: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
fd50: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
fd60: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
fd70: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
fd80: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
fd90: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
fda0: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
fdb0: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
fdc0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
fdd0: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
fde0: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
fdf0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
fe00: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
fe10: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
fe20: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
fe30: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
fe40: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
fe50: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
fe60: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
fe70: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
fe80: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
fe90: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
fea0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
feb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fec0: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
fed0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
fee0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
fef0: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
ff00: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
ff10: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
ff20: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
ff30: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
ff40: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
ff50: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
ff60: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
ff70: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
ff80: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
ff90: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
ffa0: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
ffb0: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
ffc0: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
ffd0: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
ffe0: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
fff0: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
10000 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
10010 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
10020 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
10030 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
10040 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
10050 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10060 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
10070 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
10080 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
10090 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
100a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
100b0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
100c0 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
100d0 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
100e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
100f0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
10100 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
10110 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
10120 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
10130 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
10140 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
10150 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
10160 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
10170 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
10180 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
10190 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
101a0 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
101b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
101c0 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
101d0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
101e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
101f0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
10200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10210 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
10220 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
10230 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
10240 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
10250 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
10260 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
10270 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
10280 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
10290 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
102a0 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
102b0 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
102c0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
102d0 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
102e0 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
102f0 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
10300 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
10310 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
10320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
10330 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
10340 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
10350 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
10360 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
10370 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
10380 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
10390 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
103a0 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
103b0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
103c0 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
103d0 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
103e0 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
103f0 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
10400 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
10410 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
10420 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
10430 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
10440 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
10450 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
10460 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
10470 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
10480 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
10490 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
104a0 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  /.    pFile->inN
104b0 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
104c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
104d0 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
104e0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
104f0 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
10500 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
10510 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
10520 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
10530 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
10540 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
10550 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
10560 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
10570 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
10580 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
10590 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
105a0 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
105b0 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
105c0 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
105d0 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
105e0 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
105f0 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
10600 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
10610 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
10620 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
10630 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
10640 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
10650 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
10660 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
10670 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
10680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
10690 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
106a0 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
106b0 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
106c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
106d0 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  !SQLITE_ENABLE_L
106e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
106f0 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e     (void)handleN
10700 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  FSUnlock;.      
10710 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46  assert( handleNF
10720 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65  SUnlock==0 );.#e
10730 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
10740 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
10750 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
10760 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
10770 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e   if( handleNFSUn
10780 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
10790 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20  off_t divSize = 
107a0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b  SHARED_SIZE - 1;
107b0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
107c0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
107d0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
107e0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
107f0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
10800 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10810 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
10820 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
10830 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
10840 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
10850 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
10860 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29  ock, 10)==(-1) )
10870 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
10880 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
10890 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
108a0 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
108b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
108c0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
108d0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
108e0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
108f0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
10900 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
10910 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64  ERR_UNLOCK;.#end
10920 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  if.          if(
10930 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10940 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
10950 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10960 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
10970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10980 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
10990 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
109a0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
109b0 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
109c0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
109d0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
109e0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
109f0 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10a00 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
10a10 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
10a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10a30 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10a40 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d  , &lock, 10)==(-
10a50 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
10a60 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10a70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
10a80 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10a90 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10aa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
10ab0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
10ac0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10ad0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10ae0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10af0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10b00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10b10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10b20 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10b30 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
10b40 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
10b50 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10b60 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
10b70 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10b80 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10b90 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
10ba0 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
10bb0 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10bc0 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
10bd0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10be0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
10bf0 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20   10)==(-1) ){.  
10c00 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
10c10 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f   errno;.#if OSLO
10c20 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
10c30 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
10c40 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10c50 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10c60 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10c70 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
10c80 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63  lse.          rc
10c90 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10ca0 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
10cb0 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
10cc0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
10cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
10ce0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10cf0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
10d00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
10d10 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
10d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10d30 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
10d40 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
10d50 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
10d60 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
10d70 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  E */.      {.   
10d80 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
10d90 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
10da0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
10db0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
10dc0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10dd0 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
10de0 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10df0 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
10e00 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IZE;.        if(
10e10 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10e20 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20  ile, &lock, 10) 
10e30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
10e40 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
10e50 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
10e60 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
10e70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10e80 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10e90 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10ea0 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
10eb0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
10ec0 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
10ed0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
10ee0 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
10ef0 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
10f00 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
10f10 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
10f20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
10f30 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
10f40 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
10f50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
10f60 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
10f70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
10f80 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
10f90 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
10fa0 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
10fb0 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
10fc0 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
10fd0 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
10fe0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
10ff0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
11000 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
11010 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
11020 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
11030 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
11040 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
11050 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
11060 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11070 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
11080 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
11090 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
110a0 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rrno;.#endif.   
110b0 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
110c0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
110d0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
110e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
110f0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
11100 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
11110 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
11120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11130 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
11140 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11150 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
11160 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
11170 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
11180 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
11190 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
111a0 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
111b0 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
111c0 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
111d0 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
111e0 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
111f0 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 10)==0 ){.    
11200 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
11210 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
11220 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  K;.    }else{.#i
11230 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
11240 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
11250 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
11260 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
11270 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
11280 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
11290 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
112a0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
112b0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
112c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
112d0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
112e0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
112f0 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
11300 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11310 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
11320 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
11330 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rrno;.#endif.   
11340 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
11350 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
11360 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
11370 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
11380 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
11390 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
113a0 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
113b0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
113c0 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
113d0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
113e0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
113f0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
11400 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
11410 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
11420 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
11430 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
11440 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
11450 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
11460 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11470 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
11480 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
11490 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
114a0 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
114b0 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
114c0 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
114d0 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d  ile, &lock, 10)=
114e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
114f0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
11500 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
11510 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f   }else{.#if OSLO
11520 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
11530 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 74  _IOERR.        t
11540 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11550 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11560 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11570 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
11580 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11590 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
115a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
115b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
115c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
115d0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
115e0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
115f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
11600 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 09 20 20 20  ERR_UNLOCK;..   
11610 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11620 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 65 6e 64 69  o = errno;.#endi
11630 66 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  f.        pInode
11640 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
11650 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
11660 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11670 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
11680 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
11690 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63   Decrement the c
116a0 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67  ount of locks ag
116b0 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20  ainst this same 
116c0 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a  file.  When the.
116d0 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61      ** count rea
116e0 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65  ches zero, close
116f0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20   any other file 
11700 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73  descriptors whos
11710 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77  e close.    ** w
11720 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61  as deferred beca
11730 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  use of outstandi
11740 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f  ng locks..    */
11750 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
11760 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ck--;.    assert
11770 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
11780 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
11790 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
117a0 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  {.      closePen
117b0 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
117c0 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f      }.  }...end_
117d0 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  unlock:.  unixLe
117e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
117f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11800 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
11810 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11830 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
11840 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
11850 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11860 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
11870 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
11880 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
11890 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
118a0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
118b0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
118c0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
118d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
118e0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
118f0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
11900 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
11910 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
11920 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
11930 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
11940 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
11950 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11960 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
11970 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
11980 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d  eFileLock, 0);.}
11990 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
119a0 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74  ction performs t
119b0 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  he parts of the 
119c0 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65  "close file" ope
119d0 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f  ration .** commo
119e0 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
119f0 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f   schemes. It clo
11a00 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  ses the director
11a10 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61  y and file.** ha
11a20 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61  ndles, if they a
11a30 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65  re valid, and se
11a40 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  ts all fields of
11a50 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a   the unixFile.**
11a60 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e   structure to 0.
11a70 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f  .**.** It is *no
11a80 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  t* necessary to 
11a90 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77  hold the mutex w
11aa0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
11ab0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65   is called,.** e
11ac0 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20  ven on VxWorks. 
11ad0 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65   A mutex will be
11ae0 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57   acquired on VxW
11af0 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76  orks by the.** v
11b00 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
11b10 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  eId() routine..*
11b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f  /.static int clo
11b30 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74  seUnixFile(sqlit
11b40 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11b50 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11b60 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11b70 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45  .#if OSCLOSE_CHE
11b80 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20  CK_CLOSE_IOERR. 
11b90 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
11ba0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   ){.    int err 
11bb0 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68  = close(pFile->h
11bc0 29 3b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29  );.    if( err )
11bd0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11be0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
11bf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
11c00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
11c10 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
11c20 20 20 20 20 70 46 69 6c 65 2d 3e 68 3d 2d 31 3b      pFile->h=-1;
11c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
11c40 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e  .  if( pFile->h>
11c50 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74  =0 ){.    robust
11c60 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46  _close(pFile, pF
11c70 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
11c80 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  );.    pFile->h 
11c90 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
11ca0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
11cb0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64    if( pFile->pId
11cc0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
11cd0 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20  e->isDelete ){. 
11ce0 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
11cf0 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
11d00 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
11d10 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
11d20 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
11d30 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
11d40 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
11d50 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28  endif.  OSTRACE(
11d60 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
11d70 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
11d80 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
11d90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
11da0 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29  (pFile->pUnused)
11db0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
11dc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
11dd0 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
11de0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11df0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
11e00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11e10 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74   unixClose(sqlit
11e20 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11e30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11e40 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
11e50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11e60 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e  e *)id;.  unixUn
11e70 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
11e80 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
11e90 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69  tex();..  /* uni
11ea0 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20  xFile.pInode is 
11eb0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72  always valid her
11ec0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  e. Otherwise, a 
11ed0 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a  different close.
11ee0 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e    ** routine (e.
11ef0 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29  g. nolockClose()
11f00 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65  ) would be calle
11f10 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
11f20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
11f30 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30  >pInode->nLock>0
11f40 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   || pFile->pInod
11f50 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
11f60 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =0 );.  if( ALWA
11f70 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  YS(pFile->pInode
11f80 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ) && pFile->pIno
11f90 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
11fa0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
11fb0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
11fc0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
11fd0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
11fe0 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
11ff0 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
12000 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
12010 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
12020 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
12030 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
12040 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
12050 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
12060 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
12070 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
12080 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
12090 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
120a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
120b0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
120c0 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
120d0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
120e0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
120f0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
12100 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
12110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12120 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
12130 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
12140 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
12150 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
12160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
121c0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
121d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12210 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12230 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
12240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12260 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
12270 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
12280 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
12290 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
122a0 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
122b0 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
122c0 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
122d0 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
122e0 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
122f0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
12300 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
12310 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
12320 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
12330 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
12340 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
12350 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
12360 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
12370 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
12380 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
12390 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
123a0 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
123b0 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
123c0 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
123d0 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
123e0 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
123f0 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
12400 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
12410 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
12420 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
12430 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12440 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
12450 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
12460 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
12470 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
12480 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
12490 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
124a0 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
124b0 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
124c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
124d0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
124e0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
124f0 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
12500 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
12510 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
12520 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
12530 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
12540 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
12550 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12560 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
12570 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
12580 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
12590 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
125a0 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
125b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
125c0 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
125d0 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
125e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
125f0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
12600 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
12610 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
12620 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
12630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12640 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
12650 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
12660 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
12670 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
12680 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12690 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
126a0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
126b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
126c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
126d0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
126e0 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
126f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
12700 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   {.  return clos
12710 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
12720 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12730 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
12740 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
12750 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
12780 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
127d0 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
12830 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
12840 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
12870 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
12880 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
12890 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
128a0 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
128b0 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
128c0 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
128d0 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
128e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
128f0 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
12900 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
12910 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
12920 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
12930 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
12940 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
12950 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
12960 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
12970 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
12980 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
12990 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
129a0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
129b0 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
129c0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
129d0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
129e0 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
129f0 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
12a00 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
12a10 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
12a20 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
12a30 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
12a40 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
12a50 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
12a60 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
12a70 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
12a80 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
12a90 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
12aa0 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
12ab0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
12ac0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
12ad0 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
12ae0 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
12af0 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
12b00 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
12b10 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
12b20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12b30 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
12b40 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
12b50 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
12b60 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
12b70 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
12b80 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
12b90 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
12ba0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
12bb0 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
12bc0 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
12bd0 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
12be0 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
12bf0 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
12c00 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
12c10 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
12c20 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
12c30 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
12c40 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
12c50 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
12c60 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
12c70 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
12c80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12c90 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
12ca0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
12cb0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
12cc0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
12cd0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
12ce0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
12cf0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
12d00 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
12d10 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
12d20 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
12d30 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
12d40 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
12d50 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
12d60 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
12d70 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
12d80 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
12d90 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
12da0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
12db0 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
12dc0 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
12dd0 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
12de0 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
12df0 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
12e00 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
12e10 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
12e20 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
12e30 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
12e40 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
12e50 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
12e60 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
12e70 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
12e80 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
12e90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12ea0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12eb0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
12ec0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
12ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12ee0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
12ef0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12f00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12f10 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
12f20 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12f30 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12f40 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12f50 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12f60 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
12f70 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
12f80 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
12f90 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
12fa0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12fb0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12fc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  LOCK ){.    /* E
12fd0 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65  ither this conne
12fe0 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74  ction or some ot
12ff0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
13000 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
13010 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  ss.    ** holds 
13020 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
13030 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  le.  No need to 
13040 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a  check further. *
13050 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  /.    reserved =
13060 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
13070 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20   /* The lock is 
13080 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79  held if and only
13090 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65   if the lockfile
130a0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
130b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  onst char *zLock
130c0 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
130d0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
130e0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72  ngContext;.    r
130f0 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65  eserved = osAcce
13100 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
13110 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
13120 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
13130 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
13140 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
13150 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
13160 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
13170 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
13180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13190 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
131a0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
131b0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
131c0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
131d0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
131e0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
131f0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
13200 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
13210 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
13220 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
13230 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
13240 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
13250 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
13260 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
13270 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
13280 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
13290 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
132a0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
132b0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
132c0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
132d0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
132e0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
132f0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
13300 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
13310 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
13320 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
13330 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
13340 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
13350 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
13360 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
13370 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
13380 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
13390 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
133a0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
133b0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
133c0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
133d0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
133e0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
133f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
13400 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
13410 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13420 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
13430 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
13440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13450 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
13460 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
13470 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
13480 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
13490 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
134a0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
134b0 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
134c0 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
134d0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
134e0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
134f0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
13500 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
13510 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
13520 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
13530 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
13540 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
13550 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
13560 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
13570 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13580 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
13590 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
135a0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
135b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
135c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
135d0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
135e0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
135f0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
13600 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
13610 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
13620 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
13630 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
13640 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
13650 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
13660 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13670 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
13680 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
13690 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
136a0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
136b0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
136c0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
136d0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
136e0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
136f0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
13700 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
13710 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
13720 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
13730 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
13740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13750 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
13760 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
13770 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
13780 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
13790 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
137a0 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
137b0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
137c0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
137d0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
137e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
137f0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
13800 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
13810 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
13820 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
13830 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13840 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13850 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13860 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
13870 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13880 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
13890 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
138a0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
138b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
138c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
138d0 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
138e0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
138f0 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
13900 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13910 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
13920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13930 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
13940 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
13950 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
13960 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
13970 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
13980 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
13990 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
139a0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
139b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
139c0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
139d0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
139e0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
139f0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
13a00 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
13a10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13a20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
13a30 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
13a40 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
13a50 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
13a60 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
13a70 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
13a80 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
13a90 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
13aa0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
13ab0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13ac0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13ad0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
13ae0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
13af0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
13b00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
13b10 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13b20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
13b30 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
13b40 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b   pid=%d (dotlock
13b50 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13b60 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70  eFileLock,..   p
13b70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
13b80 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
13b90 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
13ba0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
13bb0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
13bc0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
13bd0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13be0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
13bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13c00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
13c10 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
13c20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
13c30 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
13c40 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
13c50 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
13c60 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
13c70 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
13c80 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
13c90 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
13ca0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
13cb0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13cc0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
13cd0 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
13ce0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13cf0 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79    .  /* To fully
13d00 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13d10 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  base, delete the
13d20 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
13d30 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
13d40 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  k==NO_LOCK );.  
13d50 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f  rc = osRmdir(zLo
13d60 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  ckFile);.  if( r
13d70 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  c<0 && errno==EN
13d80 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f 73 55  OTDIR ) rc = osU
13d90 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
13da0 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
13db0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
13dc0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
13dd0 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45   0;.    if( ENOE
13de0 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
13df0 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
13e00 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
13e10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13e20 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
13e30 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
13e40 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
13e50 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
13e60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
13e70 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
13e80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
13e90 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13ea0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13eb0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13ec0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
13ed0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
13ee0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13ef0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
13f00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13f10 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
13f20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
13f30 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
13f40 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
13f50 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
13f60 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
13f70 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
13f80 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
13f90 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b   rc;.  if( id ){
13fa0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
13fb0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13fc0 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
13fd0 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13fe0 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
13ff0 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
14000 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
14010 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55   }.  rc = closeU
14020 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72  nixFile(id);.  r
14030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a  eturn rc;.}./***
14040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
14050 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
14060 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
14070 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
14080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14140 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
14150 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
14180 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
14190 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
141a0 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
141b0 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
141c0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
141d0 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
141e0 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
141f0 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
14200 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
14210 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
14220 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
14230 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
14240 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
14250 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
14260 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
14270 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
14280 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
14290 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
142a0 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
142b0 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
142c0 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
142d0 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
142e0 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
142f0 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
14300 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
14310 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
14320 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
14330 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
14340 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
14350 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
14360 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
14370 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
14380 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63  d off or if.** c
14390 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57  ompiling for VXW
143a0 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ORKS..*/.#if SQL
143b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
143c0 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
143d0 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52  VXWORKS../*.** R
143e0 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c  etry flock() cal
143f0 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74  ls that fail wit
14400 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65  h EINTR.*/.#ifde
14410 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69  f EINTR.static i
14420 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  nt robust_flock(
14430 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b  int fd, int op){
14440 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
14450 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f   rc = flock(fd,o
14460 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  p); }while( rc<0
14470 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
14480 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
14490 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
144a0 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61  e robust_flock(a
144b0 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23  ,b) flock(a,b).#
144c0 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a  endif.     ../*.
144d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
144e0 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
144f0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
14500 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
14510 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
14520 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
14530 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
14540 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
14550 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
14560 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
14570 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
14580 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
14590 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
145a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
145b0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
145c0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
145d0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
145e0 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
145f0 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
14600 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
14610 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
14620 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14630 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
14640 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14650 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
14660 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
14670 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14680 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
14690 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
146a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
146b0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
146c0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
146d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
146e0 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
146f0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
14700 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
14710 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
14720 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
14730 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
14740 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
14750 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
14760 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
14770 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
14780 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
14790 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
147a0 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
147b0 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
147c0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
147d0 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  t lrc = robust_f
147e0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
147f0 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
14800 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
14810 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
14820 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
14830 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
14840 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
14850 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
14860 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c  N);.      if ( l
14870 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  rc ) {.        i
14880 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
14890 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  o;.        /* un
148a0 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68  lock failed with
148b0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66   an error */.#if
148c0 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
148d0 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
148e0 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
148f0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
14900 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
14910 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
14920 3b 0a 23 65 6c 73 65 20 0a 20 20 20 20 20 20 20  ;.#else .       
14930 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
14940 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e  ERR_UNLOCK; .#en
14950 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
14960 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
14970 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
14980 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14990 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
149a0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
149b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
149c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
149d0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
149e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
149f0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
14a00 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
14a10 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
14a20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
14a30 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
14a40 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
14a50 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
14a60 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
14a70 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
14a80 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
14a90 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
14aa0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
14ab0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
14ac0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
14ad0 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
14ae0 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14af0 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
14b00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
14b10 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
14b20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
14b30 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
14b40 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
14b50 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
14b60 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
14b70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14b80 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
14b90 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
14ba0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
14bb0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
14bc0 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
14bd0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
14be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14bf0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
14c00 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
14c10 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
14c20 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
14c30 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
14c40 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14c50 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14c60 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14c70 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14c80 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14c90 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14ca0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14cb0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14cc0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14cd0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14ce0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
14cf0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
14d00 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
14d10 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
14d20 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14d30 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14d40 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14d50 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14d60 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14d70 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14d80 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14d90 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14da0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14db0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14dc0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14dd0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14de0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14df0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14e00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14e10 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14e20 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14e30 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14e40 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14e50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14e60 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14e70 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14e80 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14e90 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14ea0 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
14eb0 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
14ec0 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
14ed0 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
14ee0 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
14ef0 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
14f00 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
14f10 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
14f20 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
14f30 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
14f40 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
14f50 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
14f60 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
14f70 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
14f80 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
14f90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14fa0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
14fb0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
14fc0 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
14fd0 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
14fe0 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
14ff0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
15000 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
15010 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
15020 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
15030 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
15040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15050 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15060 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15070 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15080 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
15090 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
150a0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
150b0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
150c0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
150d0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
150e0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
150f0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
15100 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
15110 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15120 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
15130 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15140 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
15150 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
15160 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
15170 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
15180 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
15190 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
151a0 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
151b0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
151c0 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
151d0 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
151e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
151f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
15200 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
15210 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
15220 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15230 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15240 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15250 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
15260 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
15270 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
15280 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
15290 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
152a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
152b0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
152c0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
152d0 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
152e0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
152f0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
15300 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
15310 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
15320 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
15330 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
15340 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
15350 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
15360 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
15370 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
15380 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
15390 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
153a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
153b0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
153c0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
153d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
153e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
153f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
15400 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
15410 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
15420 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
15430 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
15440 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
15450 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
15460 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
15470 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
15480 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15490 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
154a0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
154b0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
154c0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
154d0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
154e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
154f0 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
15500 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15510 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
15520 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15530 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15540 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
15550 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
15560 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
15570 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
15580 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
15590 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
155a0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
155b0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
155c0 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
155d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
155e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
155f0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
15600 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
15610 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
15620 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
15630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15640 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
15650 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
15660 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
15670 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
15680 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
15690 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
156a0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
156b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
156c0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
156d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
156e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
156f0 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
15700 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
15710 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
15720 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
15730 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
15740 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
15750 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
15760 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
15770 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15780 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
15790 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
157a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
157b0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
157c0 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
157d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
157e0 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
157f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
15800 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
15810 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
15820 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
15830 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
15840 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
15850 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
15860 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
15870 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
15880 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
15890 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
158a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
158b0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
158c0 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
158d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
158e0 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
158f0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
15900 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
15910 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15960 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
159c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159d0 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
159e0 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
159f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a00 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
15a10 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
15a20 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
15a30 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
15a40 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
15a50 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
15a60 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
15a70 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
15a80 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
15a90 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
15aa0 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
15ab0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
15ac0 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
15ad0 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
15ae0 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
15af0 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
15b00 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
15b10 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
15b20 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
15b30 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
15b40 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
15b50 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
15b60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15b70 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
15b80 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
15b90 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
15ba0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
15bb0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
15bc0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
15bd0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
15be0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
15bf0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
15c00 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
15c10 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
15c20 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
15c30 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
15c40 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
15c50 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
15c60 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
15c70 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
15c80 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
15c90 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
15ca0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
15cb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15cc0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
15cd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15ce0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
15cf0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
15d00 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
15d10 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
15d20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15d30 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
15d40 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
15d50 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
15d60 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
15d70 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
15d80 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
15d90 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
15da0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
15db0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
15dc0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
15dd0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
15de0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
15df0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
15e00 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
15e10 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
15e20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
15e30 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
15e40 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
15e50 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
15e60 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
15e70 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
15e80 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
15e90 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
15ea0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
15eb0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
15ec0 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
15ed0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15ee0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
15ef0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
15f00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
15f10 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
15f20 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
15f30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
15f40 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
15f50 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
15f60 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
15f70 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
15f80 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
15f90 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
15fa0 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
15fb0 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
15fc0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
15fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15fe0 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
15ff0 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
16000 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
16010 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
16020 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
16030 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
16040 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
16050 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
16060 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
16070 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
16080 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
16090 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
160a0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
160b0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
160c0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
160d0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
160e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
160f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
16100 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
16110 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
16120 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
16130 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
16140 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
16150 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
16160 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
16170 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
16180 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
16190 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
161a0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
161b0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
161c0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
161d0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
161e0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
161f0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
16200 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
16210 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
16220 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
16230 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
16240 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
16250 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
16260 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
16270 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
16280 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
16290 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
162a0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
162b0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
162c0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
162d0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
162e0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
162f0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16300 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
16310 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16320 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16330 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
16340 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
16350 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
16360 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
16370 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
16380 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
16390 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
163a0 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
163b0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
163c0 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
163d0 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
163e0 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
163f0 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
16400 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
16410 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
16420 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
16430 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
16440 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
16450 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
16460 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
16470 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
16480 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
16490 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
164a0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
164b0 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
164c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
164d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
164e0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
164f0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16500 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
16510 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
16520 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
16530 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
16540 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
16550 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
16560 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
16570 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
16580 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
16590 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
165a0 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
165b0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
165c0 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
165d0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
165e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
165f0 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
16600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
16610 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
16620 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
16630 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
16640 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
16650 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
16660 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
16670 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
16680 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16690 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
166a0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
166b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
166c0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
166d0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
166e0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
166f0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
16700 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
16710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16720 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
16730 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
16740 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
16750 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
16760 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
16770 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
16780 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
16790 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
167a0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
167b0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
167c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
167d0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
167e0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
167f0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
16800 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
16810 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
16820 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
16830 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
16840 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16850 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
16860 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16870 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
16880 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
16890 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
168a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
168b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
168c0 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
168d0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
168e0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
168f0 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
16900 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20  , eFileLock,..  
16910 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16920 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
16930 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16940 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
16950 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
16960 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
16970 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
16980 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
16990 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
169a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
169b0 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
169c0 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
169d0 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
169e0 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
169f0 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
16a00 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16a10 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
16a20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16a30 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
16a40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16a50 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
16a60 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
16a70 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
16a80 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
16a90 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
16aa0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
16ab0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
16ac0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
16ad0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
16ae0 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
16af0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
16b00 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
16b10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16b20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
16b30 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
16b40 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
16b50 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
16b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16b70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
16b80 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
16b90 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
16ba0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
16bb0 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
16bc0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
16bd0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16be0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
16bf0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
16c00 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
16c10 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
16c20 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
16c30 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
16c40 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
16c50 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16c60 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
16c70 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
16c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16c90 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
16ca0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
16cb0 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
16cc0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
16cd0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
16ce0 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
16cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
16d00 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
16d10 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
16d20 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
16d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
16d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
16e00 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16e30 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
16e40 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
16e50 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
16e60 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
16e70 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
16e80 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
16e90 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
16ea0 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
16eb0 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
16ec0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
16ed0 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
16ee0 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
16ef0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
16f00 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
16f10 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
16f20 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
16f30 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
16f40 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
16f50 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
16f60 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
16f70 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
16f80 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
16f90 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
16fa0 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
16fb0 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
16fc0 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
16fd0 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
16fe0 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
16ff0 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
17000 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
17010 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
17020 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
17030 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
17040 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
17050 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
17060 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
17070 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
17080 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
17090 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
170a0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
170b0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
170c0 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
170d0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
170e0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
170f0 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
17100 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
17110 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
17120 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
17130 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
17140 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
17150 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
17160 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
17170 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
17180 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
17190 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
171a0 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
171b0 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
171e0 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
171f0 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
17200 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
17210 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
17220 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
17230 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
17240 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
17250 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
17260 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
17270 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
17280 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
17290 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
172a0 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
172b0 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
172c0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
172d0 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
172e0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
172f0 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
17300 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
17310 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
17320 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
17330 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
17340 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
17350 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
17360 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
17370 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
17380 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17390 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
173a0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
173b0 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
173c0 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
173d0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
173e0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
173f0 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
17400 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
17410 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
17420 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
17430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17440 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
17450 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
17460 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
17470 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
17480 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
17490 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
174a0 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
174b0 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
174c0 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
174d0 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
174e0 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
174f0 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
17500 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
17510 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
17520 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
17530 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
17540 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
17550 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
17560 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
17570 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
17580 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
17590 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
175a0 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
175b0 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
175c0 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
175d0 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
175e0 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
175f0 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
17600 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
17610 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
17620 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
17630 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
17640 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
17650 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
17660 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
17670 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
17680 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
17690 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
176a0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
176b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
176c0 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
176d0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
176e0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
176f0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
17700 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
17710 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
17720 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
17730 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
17740 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17750 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
17760 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
17770 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17780 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
17790 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
177a0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
177b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
177c0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
177d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
177e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
177f0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
17800 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
17810 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
17820 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
17830 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
17840 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
17850 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
17860 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
17870 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
17880 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
17890 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
178a0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
178b0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
178c0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
178d0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
178e0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
178f0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
17900 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
17910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
17920 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
17930 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17940 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
17950 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
17960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
17970 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
17980 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17990 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
179a0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
179b0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
179c0 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
179d0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
179e0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
179f0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
17a00 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
17a10 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20  le );.  context 
17a20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
17a30 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
17a40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
17a50 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
17a60 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
17a70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
17a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17a90 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
17aa0 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
17ab0 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
17ac0 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
17ad0 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
17ae0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
17af0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
17b00 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
17b10 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
17b20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
17b30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
17b40 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17b50 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
17b60 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
17b70 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
17b80 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
17b90 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
17ba0 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
17bb0 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
17bc0 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
17bd0 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
17be0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17bf0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17c00 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17c10 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
17c20 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
17c30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
17c40 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
17c50 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
17c60 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
17c70 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
17c80 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
17c90 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
17ca0 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
17cb0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17cc0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
17cd0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
17ce0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
17cf0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
17d00 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
17d10 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
17d20 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
17d30 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
17d40 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
17d50 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
17d60 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
17d70 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
17d80 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
17d90 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
17da0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
17db0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
17dc0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
17dd0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
17de0 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
17df0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
17e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17e10 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
17e20 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
17e30 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
17e40 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
17e50 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
17e60 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
17e70 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
17e80 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
17e90 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
17ea0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
17eb0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
17ec0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
17ed0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
17ee0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
17ef0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
17f00 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
17f10 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
17f20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
17f30 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
17f40 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
17f50 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
17f60 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
17f70 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
17f80 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
17f90 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
17fa0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
17fb0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
17fc0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
17fd0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
17fe0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
17ff0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
18000 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
18010 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
18020 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
18030 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
18040 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
18050 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
18060 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
18070 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
18080 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
18090 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
180a0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
180b0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
180c0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
180d0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
180e0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
180f0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
18100 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
18110 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
18120 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
18130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
18140 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
18150 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
18160 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
18170 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18180 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
18190 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
181a0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
181b0 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
181c0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
181d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
181e0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
181f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
18200 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
18210 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
18220 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
18230 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
18240 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
18250 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
18260 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
18270 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
18280 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
18290 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
182a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
182b0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
182c0 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
182d0 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
182e0 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
182f0 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
18300 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
18310 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
18320 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
18330 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
18340 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
18350 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
18360 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
18370 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
18380 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
18390 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
183a0 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
183b0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
183c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
183d0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
183e0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
183f0 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
18400 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
18410 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
18420 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
18430 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
18440 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
18450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
18460 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
18470 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
18480 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
18490 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
184a0 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
184b0 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
184c0 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
184d0 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
184e0 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
184f0 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
18500 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
18510 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
18520 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
18530 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
18540 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
18550 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
18560 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18570 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
18580 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
18590 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
185a0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
185b0 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
185c0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
185d0 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
185e0 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
185f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
18600 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
18610 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
18620 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
18630 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
18640 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
18650 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
18660 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18670 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
18680 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
18690 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
186a0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
186b0 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
186c0 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
186d0 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
186e0 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
186f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
18700 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
18710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
18720 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
18730 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
18740 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
18750 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
18760 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
18770 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
18780 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
18790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
187a0 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
187b0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
187c0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
187d0 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
187e0 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
187f0 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
18800 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
18810 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
18820 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
18830 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
18840 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
18850 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
18860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
18870 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
18880 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18890 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
188a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
188b0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
188c0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
188d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
188e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
188f0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18900 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
18910 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
18920 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
18930 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
18940 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
18950 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18960 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
18970 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
18980 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
18990 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
189a0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
189b0 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
189c0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
189d0 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
189e0 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
189f0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
18a00 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
18a10 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
18a20 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
18a30 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
18a40 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
18a50 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
18a60 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
18a70 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18a80 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
18a90 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
18aa0 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
18ab0 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
18ac0 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
18ad0 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
18ae0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
18af0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18b00 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
18b10 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
18b20 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
18b30 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
18b40 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
18b50 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
18b60 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
18b70 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
18b80 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
18b90 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
18ba0 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
18bb0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
18bc0 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
18bd0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
18be0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
18bf0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
18c00 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
18c10 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
18c20 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  1Errno = 0;.    
18c30 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
18c40 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
18c50 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
18c60 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18c70 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
18c80 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
18c90 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
18ca0 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
18cb0 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
18cc0 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
18cd0 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
18ce0 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
18cf0 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
18d00 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
18d10 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
18d20 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
18d30 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
18d40 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
18d50 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
18d60 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
18d70 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
18d80 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
18d90 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
18da0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18db0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
18dc0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
18dd0 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
18de0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
18df0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
18e00 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
18e10 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
18e20 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
18e30 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
18e40 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
18e50 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
18e60 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
18e70 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18e80 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18e90 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18ea0 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
18eb0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
18ec0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
18ed0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
18ee0 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
18ef0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
18f00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18f10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18f20 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
18f30 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
18f40 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
18f50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18f60 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18f70 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
18f80 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
18f90 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
18fa0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18fb0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
18fc0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18fd0 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
18fe0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
18ff0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
19000 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
19010 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
19020 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
19030 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
19040 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
19050 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
19060 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
19070 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
19080 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
19090 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
190a0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
190b0 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
190c0 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
190d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
190e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
190f0 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
19100 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
19110 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
19120 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
19130 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
19140 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
19150 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
19160 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
19170 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
19180 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
19190 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
191a0 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
191b0 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
191c0 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
191d0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
191e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
191f0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
19200 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
19210 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
19220 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
19230 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
19240 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
19250 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
19260 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
19270 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
19280 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
19290 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
192a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
192b0 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
192c0 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
192d0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
192e0 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
192f0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
19300 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
19310 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
19320 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
19330 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
19340 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
19350 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
19360 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
19370 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
19380 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
19390 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
193a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
193b0 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
193c0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
193d0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
193e0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
19410 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
19420 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
19430 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
19440 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
19450 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
19460 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
19470 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
19480 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
19490 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
194a0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
194b0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
194c0 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194e0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
194f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
19500 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
19510 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
19520 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
19530 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
19560 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
19570 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
19580 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
19590 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
195a0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
195b0 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
195c0 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
195d0 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
195e0 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
195f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19600 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
19610 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
19620 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
19630 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
19650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
19660 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
19670 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
19680 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
19690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
196a0 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
196b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
196c0 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
196d0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
196e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
196f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19700 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
19710 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
19720 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
19730 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
19740 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
19750 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
19760 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
19770 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
19780 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
19790 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
197a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
197b0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
197c0 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
197d0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
197e0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
197f0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
19800 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
19810 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
19820 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
19830 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
19840 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
19850 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
19860 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19870 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
19880 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
19890 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
198a0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
198b0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
198c0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
198d0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
198e0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
198f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19900 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
19910 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
19920 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
19930 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
19940 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
19950 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
19960 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
19970 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
19980 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19990 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
199a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
199b0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
199c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
199d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
199e0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
199f0 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
19a00 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
19a10 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
19a20 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
19a30 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
19a40 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
19a50 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
19a60 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
19a70 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
19a80 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
19a90 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
19aa0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
19ab0 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
19ac0 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
19ad0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
19ae0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
19af0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19b00 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
19b10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
19b20 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
19b30 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
19b40 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
19b50 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
19b60 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
19b70 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
19b80 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
19b90 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
19ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19bb0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
19bc0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
19bd0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
19be0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
19bf0 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
19c00 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
19c10 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
19c20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19c30 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19c40 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
19c50 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
19c60 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19c70 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
19c80 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
19c90 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
19ca0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
19cb0 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44  .    .#ifndef ND
19cc0 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
19cd0 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
19ce0 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
19cf0 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
19d00 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
19d10 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
19d20 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
19d30 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
19d40 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
19d50 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
19d60 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
19d70 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
19d80 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
19d90 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
19da0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
19db0 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
19dc0 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
19dd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
19de0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
19df0 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
19e00 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
19e10 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
19e20 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
19e30 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
19e40 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
19e50 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
19e60 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
19e70 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
19e80 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
19e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19ea0 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
19eb0 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
19ec0 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
19ed0 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
19ee0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
19ef0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
19f00 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
19f10 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
19f20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
19f30 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
19f40 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
19f50 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
19f60 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
19f70 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
19f80 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
19f90 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
19fa0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
19fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19fc0 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
19fd0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
19fe0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
19ff0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
1a000 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
1a010 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
1a020 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
1a030 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
1a040 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
1a050 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
1a060 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
1a070 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
1a080 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a090 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a0a0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
1a0b0 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
1a0c0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
1a0d0 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
1a0e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a0f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a100 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
1a110 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
1a120 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
1a130 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1a140 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1a150 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
1a160 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
1a170 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
1a180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
1a190 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
1a1a0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
1a1b0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
1a1c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
1a1d0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a1e0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a1f0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1a200 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
1a210 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
1a220 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
1a230 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
1a240 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1a250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a260 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
1a270 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
1a280 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
1a290 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
1a2a0 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
1a2b0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
1a2c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a2d0 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
1a2e0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
1a2f0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1a300 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1a310 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
1a320 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
1a330 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
1a340 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
1a350 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
1a360 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
1a370 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
1a380 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
1a390 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
1a3a0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
1a3b0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
1a3c0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
1a3d0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
1a3e0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1a3f0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
1a400 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
1a410 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
1a420 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1a430 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1a440 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
1a450 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
1a460 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1a470 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
1a480 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
1a490 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
1a4a0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1a4b0 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
1a4c0 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
1a4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a4e0 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
1a4f0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
1a500 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
1a510 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
1a520 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
1a530 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
1a540 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1a550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a560 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
1a570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a580 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
1a590 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
1a5a0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
1a5b0 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
1a5c0 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
1a5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a5e0 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
1a5f0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
1a600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a610 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a620 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
1a630 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a640 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
1a650 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
1a660 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
1a670 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
1a680 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
1a690 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a6a0 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
1a6b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1a6c0 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
1a6d0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1a6e0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
1a6f0 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
1a700 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
1a710 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1a720 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
1a730 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
1a740 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
1a750 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
1a760 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
1a770 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
1a780 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
1a790 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
1a7a0 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
1a7b0 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
1a7c0 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
1a7d0 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
1a7e0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
1a7f0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
1a800 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
1a810 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
1a820 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
1a830 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
1a840 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
1a850 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
1a860 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
1a870 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
1a880 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
1a890 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
1a8a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a8b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
1a8c0 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
1a8d0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
1a8e0 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
1a8f0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
1a900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1a910 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1a920 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1a930 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1a940 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
1a950 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
1a960 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63  e is the AFP loc
1a970 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
1a980 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
1a990 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
1a9a0 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
1a9b0 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
1a9c0 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
1a9d0 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
1a9e0 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
1a9f0 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63    If you don't c
1aa00 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63  ompile for a mac
1aa10 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78  , then the "unix
1aa20 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20  -afp".** VFS is 
1aa30 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  not available..*
1aa40 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1aa50 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
1aa60 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
1aa70 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
1aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa90 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aae0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
1aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab30 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
1ab50 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67  egin NFS Locking
1ab60 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1ab90 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1aba0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1abb0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a  ING_STYLE./*. **
1abc0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
1abd0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
1abe0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
1abf0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
1ac00 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d   eFileLock. ** m
1ac10 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
1ac20 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
1ac30 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
1ac40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
1ac50 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
1ac60 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
1ac70 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
1ac80 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
1ac90 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
1aca0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1acb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
1acc0 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c  tatic int nfsUnl
1acd0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1ace0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
1acf0 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
1ad00 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
1ad10 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a  FileLock, 1);.}.
1ad20 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1ad30 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1ad40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1ad50 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1ad60 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
1ad70 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20  bove is the NFS 
1ad80 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1ad90 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
1ada0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
1adb0 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
1adc0 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
1add0 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
1ade0 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
1adf0 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
1ae00 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  le.  .**.*******
1ae10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1ae20 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f  nd of the NFS lo
1ae30 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1ae40 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
1ae50 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1ae60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aea0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
1aeb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1af00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c  ********** Non-l
1af10 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  ocking sqlite3_f
1af20 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile methods ****
1af30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
1af50 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f  The next divisio
1af60 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65  n contains imple
1af70 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61  mentations for a
1af80 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ll methods of th
1af90 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  e .** sqlite3_fi
1afa0 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  le object other 
1afb0 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  than the locking
1afc0 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c   methods.  The l
1afd0 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64  ocking.** method
1afe0 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69  s were defined i
1aff0 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76  n divisions abov
1b000 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d  e (one locking m
1b010 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76  ethod per.** div
1b020 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d  ision).  Those m
1b030 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20  ethods that are 
1b040 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
1b050 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61  cking modes.** a
1b060 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68  re gather togeth
1b070 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76  er into this div
1b080 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ision..*/../*.**
1b090 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
1b0a0 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
1b0b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b0c0 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
1b0d0 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
1b0e0 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
1b0f0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1b100 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
1b110 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
1b120 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
1b130 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
1b140 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
1b150 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
1b160 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
1b170 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
1b180 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
1b190 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
1b1a0 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
1b1b0 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
1b1c0 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
1b1d0 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
1b1e0 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
1b1f0 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
1b200 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
1b210 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
1b220 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
1b230 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
1b240 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
1b250 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1b260 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1b270 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
1b280 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1b290 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1b2a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1b2b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1b2c0 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
1b2d0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
1b2e0 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
1b2f0 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1b300 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
1b310 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23  int prior = 0;.#
1b320 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
1b330 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
1b340 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1b350 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
1b360 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
1b370 52 5f 53 54 41 52 54 3b 0a 20 20 64 6f 7b 0a 23  R_START;.  do{.#
1b380 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1b390 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20  READ).    got = 
1b3a0 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  osPread(id->h, p
1b3b0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1b3c0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1b3d0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1b3e0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1b3f0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1b400 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
1b410 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
1b420 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
1b430 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b440 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
1b450 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73  else.    newOffs
1b460 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
1b470 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
1b480 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1b490 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
1b4a0 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28  set-- );.    if(
1b4b0 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
1b4c0 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
1b4d0 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
1b4e0 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69  ){.        ((uni
1b4f0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1b500 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1b510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b520 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1b530 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1b540 20 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a 20   0;....      }. 
1b550 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1b560 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20      }.    got = 
1b570 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  osRead(id->h, pB
1b580 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
1b590 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e  .    if( got==cn
1b5a0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  t ) break;.    i
1b5b0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1b5c0 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
1b5d0 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63  TR ){ got = 1; c
1b5e0 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20  ontinue; }.     
1b5f0 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20   prior = 0;.    
1b600 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1b610 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1b620 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62 72 65 61  rrno;.      brea
1b630 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1b640 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20   got>0 ){.      
1b650 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20  cnt -= got;.    
1b660 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b    offset += got;
1b670 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20  .      prior += 
1b680 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20  got;.      pBuf 
1b690 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20  = (void*)(got + 
1b6a0 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20  (char*)pBuf);.  
1b6b0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f    }.  }while( go
1b6c0 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45  t>0 );.  TIMER_E
1b6d0 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1b6e0 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
1b6f0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a   %7lld %llu\n",.
1b700 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e              id->
1b710 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66  h, got+prior, of
1b720 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45  fset-prior, TIME
1b730 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72  R_ELAPSED));.  r
1b740 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b  eturn got+prior;
1b750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1b760 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
1b770 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
1b780 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b790 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
1b7a0 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
1b7b0 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
1b7c0 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
1b7d0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1b7e0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1b7f0 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
1b800 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b810 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
1b820 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
1b830 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1b840 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t.){.  unixFile 
1b850 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1b860 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67  le *)id;.  int g
1b870 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
1b880 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1b890 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
1b8a0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
1b8b0 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
1b8c0 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
1b8d0 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
1b8e0 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
1b8f0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
1b900 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
1b910 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
1b920 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1b930 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
1b940 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1b950 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1b960 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1b970 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1b980 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1b990 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1b9a0 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1b9b0 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1b9c0 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1b9d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b9e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1b9f0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1ba00 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1ba10 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1ba20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1ba30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1ba40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ba50 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1ba60 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
1ba70 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1ba80 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
1ba90 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1baa0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
1bab0 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
1bac0 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
1bad0 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
1bae0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1baf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1bb00 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
1bb10 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
1bb20 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
1bb30 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
1bb40 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
1bb50 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
1bb60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1bb70 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1bb80 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
1bb90 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
1bba0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1bbb0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1bbc0 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
1bbd0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1bbe0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1bbf0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1bc00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1bc10 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
1bc20 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
1bc30 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
1bc40 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1bc50 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
1bc60 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
1bc70 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
1bc80 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
1bc90 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
1bca0 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
1bcb0 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
1bcc0 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
1bcd0 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
1bce0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
1bcf0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
1bd00 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
1bd10 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1bd20 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
1bd30 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
1bd40 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28  ot = osPwrite64(
1bd50 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
1bd60 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65  , offset);}while
1bd70 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
1bd80 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
1bd90 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66    do{.    newOff
1bda0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
1bdb0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
1bdc0 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1bdd0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
1bde0 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66  fset-- );.    if
1bdf0 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
1be00 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  set ){.      if(
1be10 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
1be20 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e   ){.        ((un
1be30 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1be40 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1be50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1be60 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1be70 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
1be80 3d 20 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a  = 0;....      }.
1be90 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1bea0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
1beb0 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20   osWrite(id->h, 
1bec0 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77  pBuf, cnt);.  }w
1bed0 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
1bee0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1bef0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
1bf00 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
1bf10 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
1bf20 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1bf30 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20   = errno;.  }.. 
1bf40 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
1bf50 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
1bf60 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68  d %llu\n", id->h
1bf70 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54  , got, offset, T
1bf80 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1bf90 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
1bfa0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1bfb0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1bfc0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
1bfd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1bfe0 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
1bff0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1c000 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
1c010 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c020 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
1c030 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1c040 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1c050 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1c060 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1c070 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
1c080 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1c090 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1c0a0 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
1c0b0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1c0c0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1c0d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1c0e0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1c0f0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1c100 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1c110 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1c120 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1c130 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1c140 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1c150 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1c160 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1c170 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1c180 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
1c190 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1c1a0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1c1b0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1c1c0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1c1d0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1c1e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1c1f0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1c200 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1c210 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1c220 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1c230 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  d to.  ** doing 
1c240 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1c250 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1c260 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1c270 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a  ther than a.  **
1c280 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1c290 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f   file) then reco
1c2a0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1c2b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1c2c0 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ** has changed. 
1c2d0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1c2e0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d  ion counter is m
1c2f0 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20  odified, record 
1c300 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74  that.  ** fact t
1c310 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  oo..  */.  if( p
1c320 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1c330 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ite ){.    pFile
1c340 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
1c350 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1c360 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
1c370 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
1c380 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
1c390 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
1c3a0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c3b0 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
1c3c0 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
1c3d0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1c3e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
1c3f0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1c400 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
1c410 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1c420 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1c430 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c440 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
1c450 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
1c460 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
1c470 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
1c480 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
1c490 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
1c4a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c4b0 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
1c4c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
1c4d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1c4e0 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
1c4f0 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
1c500 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
1c510 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1c520 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
1c530 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
1c540 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
1c550 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
1c560 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
1c570 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1c580 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
1c590 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
1c5a0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1c5b0 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
1c5c0 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
1c5d0 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
1c5e0 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
1c5f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
1c600 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
1c610 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1c620 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
1c630 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1c640 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1c650 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1c660 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1c670 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
1c680 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1c690 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  or */.      retu
1c6a0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
1c6b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1c6c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c6d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c6e0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
1c6f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1c700 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
1c710 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
1c720 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1c730 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
1c740 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
1c750 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
1c760 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
1c770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
1c780 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
1c790 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
1c7a0 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
1c7b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
1c7c0 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
1c7d0 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
1c7e0 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
1c7f0 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
1c800 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
1c810 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
1c820 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
1c830 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73   the (slightly s
1c840 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28  lower).** fsync(
1c850 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ). If you know t
1c860 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
1c870 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
1c880 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
1c890 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
1c8a0 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
1c8b0 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
1c8c0 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
1c8d0 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1c8e0 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
1c8f0 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
1c900 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
1c910 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
1c920 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
1c930 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1c940 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
1c950 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
1c960 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
1c970 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
1c980 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
1c990 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
1c9a0 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1c9b0 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
1c9c0 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
1c9d0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1c9e0 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
1c9f0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1ca00 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
1ca10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ca20 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c  USE_REQUEST_FULL
1ca30 46 53 59 4e 43 0a 23 69 6d 70 6f 72 74 20 3c 6e  FSYNC.#import <n
1ca40 6f 74 69 66 79 2e 68 3e 0a 23 69 6d 70 6f 72 74  otify.h>.#import
1ca50 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d   <libkern/OSAtom
1ca60 69 63 2e 68 3e 0a 73 74 61 74 69 63 20 4f 53 53  ic.h>.static OSS
1ca70 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c  pinLock notify_l
1ca80 6f 63 6b 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65  ock = 0;.#define
1ca90 20 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e   REQUEST_FULLSYN
1caa0 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 20 20  C_NOTIFICATION  
1cab0 20 20 22 63 6f 6d 2e 61 70 70 6c 65 2e 72 65 71    "com.apple.req
1cac0 73 79 6e 63 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a  sync".#endif../*
1cad0 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1cae0 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1caf0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1cb00 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1cb10 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1cb20 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1cb30 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1cb40 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1cb50 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1cb60 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1cb70 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1cb80 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1cb90 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1cba0 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1cbb0 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1cbc0 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1cbd0 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1cbe0 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1cbf0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1cc00 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1cc10 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1cc20 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1cc30 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1cc40 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1cc50 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1cc60 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1cc70 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1cc80 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1cc90 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1cca0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1ccb0 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1ccc0 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1ccd0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1cce0 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1ccf0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1cd00 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1cd10 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1cd20 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1cd30 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1cd40 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1cd50 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1cd60 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1cd70 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1cd80 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1cd90 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1cda0 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1cdb0 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1cdc0 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1cdd0 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1cde0 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1cdf0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1ce00 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1ce10 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1ce20 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1ce30 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1ce40 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1ce50 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1ce60 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1ce70 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1ce80 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1ce90 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1cea0 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1ceb0 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1cec0 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1ced0 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1cee0 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1cef0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1cf00 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1cf10 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1cf20 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1cf30 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1cf40 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1cf50 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1cf60 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1cf70 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1cf80 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1cf90 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1cfa0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1cfb0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1cfc0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1cfd0 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1cfe0 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1cff0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1d000 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1d010 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1d020 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d030 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1d040 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1d050 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1d060 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1d070 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1d080 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1d090 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1d0a0 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1d0b0 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1d0c0 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1d0d0 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1d0e0 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1d0f0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1d100 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d110 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1d120 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1d130 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1d140 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1d150 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1d160 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1d170 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1d180 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1d190 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1d1a0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1d1b0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1d1c0 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1d1d0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1d1e0 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1d1f0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1d200 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1d210 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1d220 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1d230 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1d240 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1d250 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1d260 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1d270 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1d280 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1d290 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1d2a0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1d2b0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1d2c0 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1d2d0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1d2e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1d2f0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1d300 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1d310 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1d320 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1d330 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1d340 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1d350 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1d360 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1d370 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1d380 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 23 69 66   fullSync ){.#if
1d390 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52  def SQLITE_USE_R
1d3a0 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43  EQUEST_FULLFSYNC
1d3b0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 79 6e  .    rc = osFsyn
1d3c0 63 28 66 64 29 3b 0a 20 20 20 20 69 66 20 28 21  c(fd);.    if (!
1d3d0 72 63 29 20 7b 0a 20 20 20 20 20 20 4f 53 53 70  rc) {.      OSSp
1d3e0 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e 6f 74 69  inLockLock(&noti
1d3f0 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  fy_lock);.      
1d400 72 63 20 3d 20 6e 6f 74 69 66 79 5f 70 6f 73 74  rc = notify_post
1d410 28 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e  (REQUEST_FULLSYN
1d420 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 29 3b  C_NOTIFICATION);
1d430 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63  .      OSSpinLoc
1d440 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f  kUnlock(&notify_
1d450 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  lock);.    }.#el
1d460 73 65 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  se.    rc = osFc
1d470 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1d480 59 4e 43 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  YNC, 0);.#endif.
1d490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1d4a0 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1d4b0 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1d4c0 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1d4d0 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1d4e0 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1d4f0 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1d500 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1d510 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1d520 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1d530 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1d540 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1d550 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1d560 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1d570 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1d580 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1d590 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1d5a0 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1d5b0 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1d5c0 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1d5d0 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1d5e0 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1d5f0 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1d600 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1d610 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1d620 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1d630 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1d640 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1d650 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1d660 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1d670 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1d680 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1d690 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1d6a0 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1d6b0 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1d6c0 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1d6d0 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1d6e0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1d6f0 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1d700 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1d710 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1d720 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1d730 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1d740 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1d750 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1d760 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1d770 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1d780 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1d790 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1d7a0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1d7b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1d7c0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1d7d0 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1d7e0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1d7f0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1d800 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1d810 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1d820 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1d830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1d850 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1d860 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1d870 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1d880 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1d890 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1d8a0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1d8b0 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1d8c0 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1d8d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d8e0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1d8f0 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1d900 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1d910 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1d920 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1d930 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1d940 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1d950 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1d960 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1d970 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1d980 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1d990 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1d9a0 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1d9b0 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1d9c0 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1d9d0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1d9e0 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1d9f0 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1da00 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1da10 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1da20 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1da30 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1da40 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1da50 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1da60 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1da70 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1da80 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1da90 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1daa0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1dab0 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1dac0 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1dad0 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1dae0 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1daf0 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1db00 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1db10 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1db20 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1db30 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1db40 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1db50 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1db60 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1db70 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1db80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1db90 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1dba0 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1dbb0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1dbc0 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1dbd0 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1dbe0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1dbf0 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1dc00 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1dc10 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1dc20 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1dc30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1dc40 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1dc50 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1dc60 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1dc70 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1dc80 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1dc90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dca0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1dcb0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1dcc0 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1dcd0 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1dce0 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1dcf0 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1dd00 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1dd10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1dd20 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1dd30 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1dd40 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1dd50 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1dd60 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1dd70 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1dd80 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1dd90 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1dda0 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1ddb0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
1ddc0 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20  _open(zDirname, 
1ddd0 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
1dde0 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
1ddf0 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46  d>=0 ){.#ifdef F
1de00 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20  D_CLOEXEC.      
1de10 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  osFcntl(fd, F_SE
1de20 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c  TFD, osFcntl(fd,
1de30 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
1de40 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
1de50 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1de60 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1de70 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1de80 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
1de90 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1dea0 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
1deb0 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45  LITE_OK:unixLogE
1dec0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1ded0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1dee0 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d  ", zDirname));.}
1def0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1df00 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1df10 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1df20 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1df30 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1df40 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1df50 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1df60 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1df70 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1df80 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1df90 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1dfa0 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1dfb0 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1dfc0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1dfd0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1dfe0 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1dff0 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1e000 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1e010 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1e020 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1e030 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1e040 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1e050 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1e060 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1e070 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1e080 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1e090 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1e0a0 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1e0b0 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1e0c0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1e0d0 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1e0e0 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1e0f0 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1e100 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1e110 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1e120 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1e130 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1e140 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1e150 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1e160 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1e170 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1e180 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1e190 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1e1a0 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1e1b0 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1e1c0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1e1d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1e1e0 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1e1f0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1e200 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1e210 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1e220 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1e230 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1e240 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1e250 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1e260 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1e270 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1e280 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1e290 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1e2a0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1e2b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e2c0 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1e2d0 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1e2e0 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1e2f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e300 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1e310 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1e320 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1e330 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1e340 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1e350 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1e360 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1e370 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1e380 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1e390 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1e3a0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1e3b0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1e3c0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1e3d0 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1e3e0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1e3f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1e400 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1e410 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1e420 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1e430 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1e440 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1e450 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1e460 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e470 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1e480 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1e490 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1e4a0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1e4b0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e4c0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
1e4d0 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
1e4e0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1e4f0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
1e500 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
1e510 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
1e520 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
1e530 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
1e540 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
1e550 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
1e560 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rance.  Many sys
1e570 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
1e580 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
1e590 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
1e5a0 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
1e5b0 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
1e5c0 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
1e5d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1e5e0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1e5f0 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
1e600 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
1e610 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
1e620 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
1e630 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1e640 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
1e650 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
1e660 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1e670 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1e680 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
1e690 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
1e6a0 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
1e6b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e6c0 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d  TE_OK && dirfd>=
1e6d0 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f  0 ){.      full_
1e6e0 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20  fsync(dirfd, 0, 
1e6f0 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f  0);.#if OSCLOSE_
1e700 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52  CHECK_CLOSE_IOER
1e710 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  R.      if( clos
1e720 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 20  e(pFile->dirfd) 
1e730 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1e740 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1e750 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
1e760 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
1e770 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  IR_CLOSE;.      
1e780 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 6f  }.#else.      ro
1e790 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1e7a0 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1e7b0 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  _);.#endif.    }
1e7c0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1e7d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
1e7e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e7f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e800 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e810 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
1e820 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65  RSYNC;..  }.  re
1e830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e840 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1e850 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1e860 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1e870 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1e880 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1e890 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1e8a0 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1e8b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1e8c0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1e8d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1e8e0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1e8f0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1e900 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1e910 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1e920 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1e930 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1e940 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1e950 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1e960 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1e970 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1e980 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1e990 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1e9a0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1e9b0 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1e9c0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1e9d0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1e9e0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1e9f0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1ea00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1ea10 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20  e->szChunk ){.  
1ea20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
1ea30 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
1ea40 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
1ea50 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1ea60 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
1ea70 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72   rc = robust_ftr
1ea80 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1ea90 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
1eaa0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1eab0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1eac0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1ead0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1eae0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1eaf0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1eb00 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1eb10 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  th);.  }else{.#i
1eb20 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1eb30 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1eb40 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1eb50 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1eb60 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1eb70 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  d to.    ** doin
1eb80 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1eb90 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
1eba0 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
1ebb0 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
1ebc0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1ebd0 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77  base file) and w
1ebe0 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  e truncate the f
1ebf0 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1ec00 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  th,.    ** that 
1ec10 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61  effectively upda
1ec20 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63  tes the change c
1ec30 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69  ounter.  This mi
1ec40 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a  ght happen.    *
1ec50 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67  * when restoring
1ec60 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e   a database usin
1ec70 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  g the backup API
1ec80 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e   from a zero-len
1ec90 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63  gth.    ** sourc
1eca0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1ecb0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
1ecc0 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d  lWrite && nByte=
1ecd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
1ece0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
1ecf0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
1ed00 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
1ed10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1ed20 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1ed30 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1ed40 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1ed50 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1ed60 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1ed70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1ed80 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1ed90 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1eda0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1edb0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1edc0 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1edd0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1ede0 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1edf0 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1ee00 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1ee10 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1ee20 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1ee30 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1ee40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ee50 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
1ee60 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
1ee70 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70  e;..  /* When op
1ee80 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a  ening a zero-siz
1ee90 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1eea0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
1eeb0 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
1eec0 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
1eed0 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
1eee0 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
1eef0 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
1ef00 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
1ef10 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
1ef20 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
1ef30 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
1ef40 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
1ef50 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
1ef60 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
1ef70 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
1ef80 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
1ef90 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
1efa0 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
1efb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
1efc0 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
1efd0 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
1efe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1eff0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f000 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1f010 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1f020 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
1f030 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
1f040 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
1f050 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
1f060 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
1f070 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
1f080 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
1f090 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
1f0a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1f0b0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
1f0c0 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  d*);.#endif../* 
1f0d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f0e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
1f0f0 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45  andle the SQLITE
1f100 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1f110 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   .** file-contro
1f120 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e  l operation.  En
1f130 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61  large the databa
1f140 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20  se to nBytes in 
1f150 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64  size.** (rounded
1f160 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
1f170 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66  chunk-size).  If
1f180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f190 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74   already.** nByt
1f1a0 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68  es or larger, th
1f1b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1f1c0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1f1d0 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69   int fcntlSizeHi
1f1e0 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  nt(unixFile *pFi
1f1f0 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  le, i64 nByte){.
1f200 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1f210 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36  hunk>0 ){.    i6
1f220 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
1f230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f240 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1f250 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
1f260 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
1f270 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1f280 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
1f290 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
1f2a0 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f  */.   .    if( o
1f2b0 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
1f2c0 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
1f2d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f2e0 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d  AT;..    nSize =
1f2f0 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1f300 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1f310 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1f320 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1f330 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1f340 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1f350 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1f360 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1f370 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1f380 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1f390 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1f3a0 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1f3b0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1f3c0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1f3d0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1f3e0 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1f3f0 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1f400 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1f410 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1f420 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1f430 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1f440 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1f450 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1f460 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1f470 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1f480 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1f490 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1f4a0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1f4b0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1f4c0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1f4d0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1f4e0 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1f4f0 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
1f500 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f510 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1f520 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1f530 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1f540 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1f550 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20  it. First use.  
1f560 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65      ** ftruncate
1f570 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69  () to set the fi
1f580 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72  le size, then wr
1f590 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ite a single byt
1f5a0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  e to.      ** th
1f5b0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1f5c0 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e  ach block within
1f5d0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1f5e0 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20  gion. This.     
1f5f0 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1f600 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62  technique used b
1f610 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65  y glibc to imple
1f620 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  ment posix_fallo
1f630 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  cate().      ** 
1f640 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  on systems that 
1f650 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
1f660 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73  al fallocate() s
1f670 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20  ystem call..    
1f680 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1f690 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1f6a0 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1f6b0 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1f6c0 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1f6d0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1f6e0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1f6f0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1f700 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72   */..      if( r
1f710 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1f720 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29  pFile->h, nSize)
1f730 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1f740 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1f750 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
1f760 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1f770 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1f780 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1f790 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1f7a0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1f7b0 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
1f7c0 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
1f7d0 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
1f7e0 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c  lk-1;.      whil
1f7f0 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20  e( iWrite<nSize 
1f800 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1f810 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
1f820 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
1f830 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
1f840 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
1f850 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1f860 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1f870 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d         iWrite +=
1f880 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23   nBlk;.      }.#
1f890 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1f8a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f8b0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c  _OK;.}..#if (SQL
1f8c0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
1f8d0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
1f8e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69  ed(__APPLE__).#i
1f8f0 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f  nclude "sqlite3_
1f900 70 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c  private.h".#incl
1f910 75 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e  ude <copyfile.h>
1f920 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44  .static int getD
1f930 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
1f940 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1f950 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 3b  , char *dbPath);
1f960 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
1f970 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  nt isProxyLockin
1f980 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a  gMode(unixFile *
1f990 29 3b 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  );..#if (SQLITE_
1f9a0 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
1f9b0 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
1f9c0 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61 74 69 63  _APPLE__).static
1f9d0 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1f9e0 65 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69  eDatabase(unixFi
1f9f0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 62  le *pFile, int b
1fa00 46 6c 61 67 73 29 20 7b 0a 20 20 73 71 6c 69 74  Flags) {.  sqlit
1fa10 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73  e3_file *id = (s
1fa20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46  qlite3_file *)pF
1fa30 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
1fa40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69  SQLITE_OK;.  voi
1fa50 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b  d *pLock = NULL;
1fa60 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
1fa70 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 46  ;.  int corruptF
1fa80 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69  ileLock = 0;.  i
1fa90 6e 74 20 69 73 43 6f 72 72 75 70 74 20 3d 20 30  nt isCorrupt = 0
1faa0 3b 0a 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54  ;.    .#if SQLIT
1fab0 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
1fac0 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73  OTECTION.  flags
1fad0 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46   |= pFile->protF
1fae0 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66  lags;.#endif.#if
1faf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1fb00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
1fb10 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  f( isProxyLockin
1fb20 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a  gMode(pFile) ){.
1fb30 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
1fb40 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1fb50 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  XY;.  }.#endif. 
1fb60 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
1fb70 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70  demo_superlock(p
1fb80 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20  File->zPath, 0, 
1fb90 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c  flags, 0, 0, &pL
1fba0 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ock);.  if( rc )
1fbb0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
1fbc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
1fbd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44  rc==SQLITE_NOTAD
1fbe0 42 20 29 7b 0a 20 20 20 20 20 20 69 73 43 6f 72  B ){.      isCor
1fbf0 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rupt = 1;.      
1fc00 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
1fc10 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75  _superlock_corru
1fc20 70 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  pt(id, SQLITE_LO
1fc30 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c 20 26 63  CK_EXCLUSIVE, &c
1fc40 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b  orruptFileLock);
1fc50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1fc60 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
1fc70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1fc80 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d    rc = pFile->pM
1fc90 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65  ethod->xTruncate
1fca0 28 69 64 2c 20 28 28 70 46 69 6c 65 2d 3e 66 73  (id, ((pFile->fs
1fcb0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1fcc0 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
1fcd0 20 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c   != 0) ? 1L : 0L
1fce0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1fcf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e  ITE_OK ){.    un
1fd00 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70  ixInvalidateSupp
1fd10 6f 72 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20  ortFiles(pFile, 
1fd20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
1fd30 3e 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28  >pMethod->xSync(
1fd40 69 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  id, SQLITE_SYNC_
1fd50 46 55 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28 20 69  FULL);...  if( i
1fd60 73 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20  sCorrupt ){.    
1fd70 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
1fd80 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
1fd90 69 64 2c 20 63 6f 72 72 75 70 74 46 69 6c 65 4c  id, corruptFileL
1fda0 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ock);.  }else{. 
1fdb0 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
1fdc0 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b  uperunlock(pLock
1fdd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1fde0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
1fdf0 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65  t unixInvalidate
1fe00 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e 69  SupportFiles(uni
1fe10 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
1fe20 74 20 73 6b 69 70 57 41 4c 29 20 7b 0a 20 20 63  t skipWAL) {.  c
1fe30 68 61 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54  har jPath[MAXPAT
1fe40 48 4c 45 4e 2b 39 5d 3b 0a 20 20 69 6e 74 20 7a  HLEN+9];.  int z
1fe50 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6a 50  Len = strlcpy(jP
1fe60 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
1fe70 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29  h, MAXPATHLEN+9)
1fe80 3b 0a 20 20 69 66 28 20 7a 4c 65 6e 3c 4d 41 58  ;.  if( zLen<MAX
1fe90 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 73  PATHLEN ){.    s
1fea0 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20 20  ize_t jLen;.    
1feb0 63 6f 6e 73 74 20 63 68 61 72 20 65 78 74 65 6e  const char exten
1fec0 73 69 6f 6e 73 5b 33 5d 5b 39 5d 20 3d 20 7b 20  sions[3][9] = { 
1fed0 22 2d 77 61 6c 22 2c 20 22 2d 6a 6f 75 72 6e 61  "-wal", "-journa
1fee0 6c 22 2c 20 22 2d 73 68 6d 22 20 7d 3b 0a 20 20  l", "-shm" };.  
1fef0 20 20 69 6e 74 20 6a 20 3d 20 28 73 6b 69 70 57    int j = (skipW
1ff00 41 4c 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  AL ? 1 : 0);.   
1ff10 20 66 6f 72 28 20 3b 20 6a 3c 33 3b 20 6a 2b 2b   for( ; j<3; j++
1ff20 20 29 7b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   ){.      .     
1ff30 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1ff40 20 69 66 20 74 68 65 20 73 68 6d 20 66 69 6c 65   if the shm file
1ff50 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
1ff60 65 64 20 66 6f 72 20 74 68 69 73 20 70 46 69 6c  ed for this pFil
1ff70 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6a  e */.      if( j
1ff80 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==2 ){.        u
1ff90 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1ffa0 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
1ffb0 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
1ffc0 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
1ffd0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ds */.        un
1ffe0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1fff0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
20000 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
20010 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e         if( pShmN
20020 6f 64 65 20 26 26 20 21 70 53 68 6d 4e 6f 64 65  ode && !pShmNode
20030 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ->isReadonly ){.
20040 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
20050 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20   stat sStat;.   
20060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
20070 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
20080 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  ode->mutex);.   
20090 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
200a0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
200b0 68 3e 3d 30 20 26 26 20 21 6f 73 46 73 74 61 74  h>=0 && !osFstat
200c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
200d0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
200e0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f       unsigned lo
200f0 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74  ng size = (sStat
20100 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53  .st_size<4) ? sS
20110 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b  tat.st_size : 4;
20120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20130 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20   size>0 ){.     
20140 20 20 20 20 20 20 20 20 20 62 7a 65 72 6f 28 70           bzero(p
20150 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
20160 6e 5b 30 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  n[0], size);.   
20170 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20180 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
20190 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
201a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
201b0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
201c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
201d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
201e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
201f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
20200 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
20210 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20220 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20230 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
20240 74 65 78 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tex();.      }. 
20250 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c       jLen = strl
20260 63 70 79 28 26 6a 50 61 74 68 5b 7a 4c 65 6e 5d  cpy(&jPath[zLen]
20270 2c 20 65 78 74 65 6e 73 69 6f 6e 73 5b 6a 5d 2c  , extensions[j],
20280 20 39 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a   9);.      if( j
20290 4c 65 6e 20 3c 20 39 20 29 7b 0a 20 20 20 20 20  Len < 9 ){.     
202a0 20 20 20 69 6e 74 20 6a 66 6c 61 67 73 20 3d 20     int jflags = 
202b0 28 6a 3c 32 29 20 3f 20 4f 5f 54 52 55 4e 43 20  (j<2) ? O_TRUNC 
202c0 3a 20 4f 5f 52 44 57 52 3b 0a 20 20 20 20 20 20  : O_RDWR;.      
202d0 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70 65 6e    int jfd = open
202e0 28 6a 50 61 74 68 2c 20 6a 66 6c 61 67 73 29 3b  (jPath, jflags);
202f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 66 64  .        if( jfd
20300 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
20310 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45      if( errno!=E
20320 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  NOENT ){.       
20330 20 20 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74       perror(jPat
20340 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  h);.          }.
20350 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20360 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
20370 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
20380 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
20390 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stat;.          
203a0 20 20 69 66 28 20 21 6f 73 46 73 74 61 74 28 6a    if( !osFstat(j
203b0 66 64 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  fd, &sStat) ){. 
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
203d0 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20  igned long size 
203e0 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  = (sStat.st_size
203f0 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73  <4) ? sStat.st_s
20400 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20  ize : 4;.       
20410 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e         if( size>
20420 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
20430 20 20 20 20 20 75 69 6e 74 33 32 5f 74 20 7a 65       uint32_t ze
20440 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
20450 20 20 20 20 20 20 20 20 70 77 72 69 74 65 28 6a          pwrite(j
20460 66 64 2c 20 26 7a 65 72 6f 2c 20 28 73 69 7a 65  fd, &zero, (size
20470 5f 74 29 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20  _t)size, 0);.   
20480 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20490 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
204a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
204b0 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20 20   fsync(jfd);.   
204c0 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64         close(jfd
204d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
204e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
204f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20500 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
20510 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61   unixReplaceData
20520 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  base(unixFile *p
20530 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a 73  File, sqlite3 *s
20540 72 63 64 62 29 20 7b 0a 20 20 73 71 6c 69 74 65  rcdb) {.  sqlite
20550 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73 71  3_file *id = (sq
20560 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46 69  lite3_file *)pFi
20570 6c 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 53 72  le;.  Btree *pSr
20580 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20  cBtree = NULL;. 
20590 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
205a0 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  rc_file = NULL;.
205b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 53 72 63    unixFile *pSrc
205c0 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63  File = NULL;.  c
205d0 68 61 72 20 73 72 63 57 61 6c 50 61 74 68 5b 4d  har srcWalPath[M
205e0 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20  AXPATHLEN+5];.  
205f0 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20 2d  int srcWalFD = -
20600 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
20610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20  LITE_OK;.  void 
20620 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  *pLock = NULL;. 
20630 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a   int flags = 0;.
20640 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62    sqlite3 *srcdb
20650 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70 79  2 = NULL;.  copy
20660 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a  file_state_t s;.
20670 20 20 69 6e 74 20 63 6f 72 72 75 70 74 53 72 63    int corruptSrc
20680 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  FileLock = 0;.  
20690 69 6e 74 20 63 6f 72 72 75 70 74 44 73 74 46 69  int corruptDstFi
206a0 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  leLock = 0;.  in
206b0 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d  t isSrcCorrupt =
206c0 20 30 3b 0a 20 20 69 6e 74 20 69 73 44 73 74 43   0;.  int isDstC
206d0 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a 20  orrupt = 0;.  . 
206e0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
206f0 65 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64 62  etyCheckOk(srcdb
20700 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
20710 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
20720 20 7d 0a 20 20 20 20 0a 23 69 66 20 53 51 4c 49   }.    .#if SQLI
20730 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
20740 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67  ROTECTION.  flag
20750 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74  s |= pFile->prot
20760 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69  Flags;.#endif.#i
20770 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20780 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
20790 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69  if( isProxyLocki
207a0 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b  ngMode(pFile) ){
207b0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
207c0 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
207d0 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  OXY;.  }.#endif.
207e0 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
207f0 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28  3demo_superlock(
20800 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c  pFile->zPath, 0,
20810 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70   flags, 0, 0, &p
20820 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20  Lock);.  if( rc 
20830 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
20840 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
20850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41   rc==SQLITE_NOTA
20860 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73 44 73  DB ){.      isDs
20870 74 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20  tCorrupt = 1;.  
20880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20890 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63  demo_superlock_c
208a0 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49 54  orrupt(id, SQLIT
208b0 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45  E_LOCK_EXCLUSIVE
208c0 2c 20 26 63 6f 72 72 75 70 74 44 73 74 46 69 6c  , &corruptDstFil
208d0 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  eLock);.    }.  
208e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
208f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20900 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 67 65 74 20   }.  }.  /* get 
20910 74 68 65 20 73 72 63 20 66 69 6c 65 20 64 65 73  the src file des
20920 63 72 69 70 74 6f 72 20 61 64 68 65 72 69 6e 67  criptor adhering
20930 20 74 6f 20 74 68 65 20 64 62 20 73 74 72 75 63   to the db struc
20940 74 20 61 63 63 65 73 73 20 72 75 6c 65 73 20 0a  t access rules .
20950 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
20960 69 73 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72  is modeled after
20970 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
20980 6e 74 72 6f 6c 28 29 20 69 6e 20 6d 61 69 6e 2e  ntrol() in main.
20990 63 0a 20 20 20 2a 2f 20 0a 20 20 73 71 6c 69 74  c.   */ .  sqlit
209a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
209b0 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcdb->mutex);.  
209c0 69 66 28 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30  if( srcdb->nDb>0
209d0 20 29 7b 0a 20 20 20 20 70 53 72 63 42 74 72 65   ){.    pSrcBtre
209e0 65 20 3d 20 73 72 63 64 62 2d 3e 61 44 62 5b 30  e = srcdb->aDb[0
209f0 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20 20 69 66 28  ].pBt;.  }.  if(
20a00 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20   pSrcBtree ){.  
20a10 20 20 50 61 67 65 72 20 2a 70 53 72 63 50 61 67    Pager *pSrcPag
20a20 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  er;.    sqlite3B
20a30 74 72 65 65 45 6e 74 65 72 28 70 53 72 63 42 74  treeEnter(pSrcBt
20a40 72 65 65 29 3b 0a 20 20 20 20 70 53 72 63 50 61  ree);.    pSrcPa
20a50 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
20a60 65 65 50 61 67 65 72 28 70 53 72 63 42 74 72 65  eePager(pSrcBtre
20a70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
20a80 70 53 72 63 50 61 67 65 72 21 3d 30 20 29 3b 0a  pSrcPager!=0 );.
20a90 20 20 20 20 73 72 63 5f 66 69 6c 65 20 3d 20 73      src_file = s
20aa0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
20ab0 70 53 72 63 50 61 67 65 72 29 3b 0a 20 20 20 20  pSrcPager);.    
20ac0 61 73 73 65 72 74 28 20 73 72 63 5f 66 69 6c 65  assert( src_file
20ad0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
20ae0 72 63 5f 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  rc_file->pMethod
20af0 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  s ){.      int s
20b00 72 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  rcFlags = 0;.   
20b10 20 20 20 70 53 72 63 46 69 6c 65 20 3d 20 28 75     pSrcFile = (u
20b20 6e 69 78 46 69 6c 65 20 2a 29 73 72 63 5f 66 69  nixFile *)src_fi
20b30 6c 65 3b 0a 20 20 20 20 20 20 2f 2a 20 77 61 6c  le;.      /* wal
20b40 20 6d 6f 64 65 20 64 62 20 63 61 6e 6e 6f 74 20   mode db cannot 
20b50 62 65 20 6f 70 65 6e 65 64 20 72 65 61 64 6f 6e  be opened readon
20b60 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28  ly */.      if (
20b70 28 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e 46  (pSrcFile->openF
20b80 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20 3d  lags & O_RDWR) =
20b90 3d 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20 20  = O_RDWR) {.    
20ba0 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53      srcFlags = S
20bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20bc0 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 20 65 6c  RITE;.      } el
20bd0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63  se {.        src
20be0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
20bf0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
20c00 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
20c10 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
20c20 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 73 72  TECTION.      sr
20c30 63 46 6c 61 67 73 20 7c 3d 20 70 53 72 63 46 69  cFlags |= pSrcFi
20c40 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23  le->protFlags;.#
20c50 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
20c60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
20c70 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
20c80 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
20c90 64 65 28 70 53 72 63 46 69 6c 65 29 20 29 7b 0a  de(pSrcFile) ){.
20ca0 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
20cb0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
20cc0 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20  AUTOPROXY;.     
20cd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
20cf0 6e 5f 76 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a  n_v2(pSrcFile->z
20d00 50 61 74 68 2c 20 26 73 72 63 64 62 32 2c 20 73  Path, &srcdb2, s
20d10 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  rcFlags, 0);.   
20d20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20d40 2f 2a 20 73 74 61 72 74 20 61 20 64 65 66 65 72  /* start a defer
20d50 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  red transaction 
20d60 61 6e 64 20 72 65 61 64 20 74 6f 20 65 73 74 61  and read to esta
20d70 62 6c 69 73 68 20 61 20 72 65 61 64 20 6c 6f 63  blish a read loc
20d80 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
20d90 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73  = sqlite3_exec(s
20da0 72 63 64 62 32 2c 20 22 42 45 47 49 4e 20 44 45  rcdb2, "BEGIN DE
20db0 46 45 52 52 45 44 3b 20 50 52 41 47 4d 41 20 73  FERRED; PRAGMA s
20dc0 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 20  chema_version", 
20dd0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
20de0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20df0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
20e00 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
20e10 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63  .          isSrc
20e20 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
20e30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20e40 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
20e50 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69  k_corrupt(src_fi
20e60 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  le, SQLITE_LOCK_
20e70 53 48 41 52 45 44 2c 20 26 63 6f 72 72 75 70 74  SHARED, &corrupt
20e80 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  SrcFileLock);.  
20e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20ea0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
20eb0 21 73 72 63 64 62 32 20 7c 7c 20 70 53 72 63 46  !srcdb2 || pSrcF
20ec0 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72  ile==NULL || pSr
20ed0 63 46 69 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20 20  cFile->h<0){.   
20ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
20ef0 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28  ERNAL;.  }.  if(
20f00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20f10 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 72  {.    goto end_r
20f20 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3b  eplace_database;
20f30 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f 74 68 20 64  .  }.  /* both d
20f40 61 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f 63  atabases are loc
20f50 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ked appropriatel
20f60 79 2c 20 63 6f 70 79 20 74 68 65 20 73 72 63 20  y, copy the src 
20f70 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a  wal journal if .
20f80 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69 73 74 73     ** one exists
20f90 20 61 6e 64 20 74 68 65 6e 20 74 68 65 20 61 63   and then the ac
20fa0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  tual database fi
20fb0 6c 65 0a 20 20 20 2a 2f 0a 20 20 73 74 72 6c 63  le.   */.  strlc
20fc0 70 79 28 73 72 63 57 61 6c 50 61 74 68 2c 20 70  py(srcWalPath, p
20fd0 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  SrcFile->zPath, 
20fe0 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
20ff0 20 73 74 72 6c 63 61 74 28 73 72 63 57 61 6c 50   strlcat(srcWalP
21000 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58  ath, "-wal", MAX
21010 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 72  PATHLEN+5);.  sr
21020 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 73 72  cWalFD = open(sr
21030 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 4f 4e  cWalPath, O_RDON
21040 4c 59 29 3b 0a 20 20 69 66 28 20 21 28 73 72 63  LY);.  if( !(src
21050 57 61 6c 46 44 3c 30 29 20 29 7b 0a 20 20 20 20  WalFD<0) ){.    
21060 63 68 61 72 20 64 73 74 57 61 6c 50 61 74 68 5b  char dstWalPath[
21070 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20  MAXPATHLEN+5];. 
21080 20 20 20 69 6e 74 20 64 73 74 57 61 6c 46 44 20     int dstWalFD 
21090 3d 20 2d 31 3b 0a 20 20 20 20 73 74 72 6c 63 70  = -1;.    strlcp
210a0 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20 70 46  y(dstWalPath, pF
210b0 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50  ile->zPath, MAXP
210c0 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 73  ATHLEN+5);.    s
210d0 74 72 6c 63 61 74 28 64 73 74 57 61 6c 50 61 74  trlcat(dstWalPat
210e0 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41  h, "-wal", MAXPA
210f0 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 64 73  THLEN+5);.    ds
21100 74 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 64 73  tWalFD = open(ds
21110 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52  tWalPath, O_RDWR
21120 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54 45  |O_CREAT, SQLITE
21130 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
21140 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
21150 69 66 28 20 21 28 64 73 74 57 61 6c 46 44 3c 30  if( !(dstWalFD<0
21160 29 20 29 7b 0a 20 20 20 20 20 20 73 20 3d 20 63  ) ){.      s = c
21170 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c  opyfile_state_al
21180 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 6c 73 65  loc();.      lse
21190 65 6b 28 73 72 63 57 61 6c 46 44 2c 20 30 2c 20  ek(srcWalFD, 0, 
211a0 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20  SEEK_SET);.     
211b0 20 6c 73 65 65 6b 28 64 73 74 57 61 6c 46 44 2c   lseek(dstWalFD,
211c0 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
211d0 20 20 20 20 20 69 66 28 20 66 63 6f 70 79 66 69       if( fcopyfi
211e0 6c 65 28 73 72 63 57 61 6c 46 44 2c 20 64 73 74  le(srcWalFD, dst
211f0 57 61 6c 46 44 2c 20 73 2c 20 43 4f 50 59 46 49  WalFD, s, COPYFI
21200 4c 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  LE_ALL) ){.     
21210 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
21220 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
21230 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20  (err) {.        
21240 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20    case ENOMEM:. 
21250 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21270 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21280 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
21290 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
212a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
212b0 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20   = err;.        
212c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
212d0 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
212e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
212f0 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72  opyfile_state_fr
21300 65 65 28 73 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ee(s);.      clo
21310 73 65 28 64 73 74 57 61 6c 46 44 29 3b 0a 20 20  se(dstWalFD);.  
21320 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 73 72    }.    close(sr
21330 63 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20 20 69  cWalFD);.  }.  i
21340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21350 20 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66 6f 72   ){.    /* befor
21360 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73 75 72  e we copy, ensur
21370 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
21380 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
21390 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64 20  ill be modified 
213a0 2a 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20  */.    uint32_t 
213b0 73 72 63 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  srcChange = 0;. 
213c0 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74 43     uint32_t dstC
213d0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 70  hange = 0;.    p
213e0 72 65 61 64 28 70 53 72 63 46 69 6c 65 2d 3e 68  read(pSrcFile->h
213f0 2c 20 26 73 72 63 43 68 61 6e 67 65 2c 20 34 2c  , &srcChange, 4,
21400 20 32 34 29 3b 0a 20 20 20 20 70 72 65 61 64 28   24);.    pread(
21410 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68  pFile->h, &dstCh
21420 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20  ange, 4, 24);.  
21430 20 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 74    .    /* copy t
21440 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
21450 73 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20 63 6f  se */.    s = co
21460 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c  pyfile_state_all
21470 6f 63 28 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28  oc();.    lseek(
21480 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30 2c 20  pSrcFile->h, 0, 
21490 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 6c  SEEK_SET);.    l
214a0 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30  seek(pFile->h, 0
214b0 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
214c0 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 70   if( fcopyfile(p
214d0 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  SrcFile->h, pFil
214e0 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c  e->h, s, COPYFIL
214f0 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  E_ALL) ){.      
21500 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
21510 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
21520 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   {.        case 
21530 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20  ENOMEM:.        
21540 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21550 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
21560 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
21570 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
21580 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
21590 6f 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 20  o = err;.       
215a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
215b0 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OERR;.      }.  
215c0 20 20 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c 65    }.    copyfile
215d0 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a  _state_free(s);.
215e0 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 72 63      .    if (src
215f0 43 68 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61  Change == dstCha
21600 6e 67 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  nge) {.      /* 
21610 6d 6f 64 69 66 79 20 74 68 65 20 63 68 61 6e 67  modify the chang
21620 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72  e counter to for
21630 63 65 20 70 61 67 65 20 7a 65 72 6f 20 74 6f 20  ce page zero to 
21640 62 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20  be reloaded */. 
21650 20 20 20 20 20 64 73 74 43 68 61 6e 67 65 20 2b       dstChange +
21660 2b 3b 0a 20 20 20 20 20 20 70 77 72 69 74 65 28  +;.      pwrite(
21670 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68  pFile->h, &dstCh
21680 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20  ange, 4, 24);.  
21690 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
216a0 53 72 63 43 6f 72 72 75 70 74 20 29 7b 0a 20 20  SrcCorrupt ){.  
216b0 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
216c0 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70  perunlock_corrup
216d0 74 28 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72  t(src_file, corr
216e0 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b  uptSrcFileLock);
216f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
21700 20 64 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73   done with the s
21710 6f 75 72 63 65 20 64 62 20 73 6f 20 65 6e 64 20  ource db so end 
21720 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21730 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  */.    sqlite3_e
21740 78 65 63 28 73 72 63 64 62 32 2c 20 22 43 4f 4d  xec(srcdb2, "COM
21750 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
21760 20 20 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75    }.  /* zero ou
21770 74 20 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61  t any old journa
21780 6c 20 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69  l clutter */.  i
21790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
217a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70   ){.    int skip
217b0 57 41 4c 20 3d 20 28 73 72 63 57 61 6c 46 44 3c  WAL = (srcWalFD<
217c0 30 29 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78  0)?0:1;.    unix
217d0 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72  InvalidateSuppor
217e0 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b  tFiles(pFile, sk
217f0 69 70 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65  ipWAL);.  }.  .e
21800 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62  nd_replace_datab
21810 61 73 65 3a 0a 20 20 69 66 28 20 70 53 72 63 42  ase:.  if( pSrcB
21820 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
21830 74 65 33 5f 63 6c 6f 73 65 28 73 72 63 64 62 32  te3_close(srcdb2
21840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
21850 72 65 65 4c 65 61 76 65 28 70 53 72 63 42 74 72  reeLeave(pSrcBtr
21860 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
21870 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
21880 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcdb->mutex);.  
21890 69 66 28 20 69 73 44 73 74 43 6f 72 72 75 70 74  if( isDstCorrupt
218a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
218b0 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f  emo_superunlock_
218c0 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72  corrupt(id, corr
218d0 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b  uptDstFileLock);
218e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
218f0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
21900 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20  nlock(pLock);.  
21910 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21920 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
21930 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20  FILE_HEADER_LEN 
21940 31 36 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  16./* Check for 
21950 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f  a conflicting lo
21960 63 6b 2e 20 20 49 66 20 6f 6e 65 20 69 73 20 66  ck.  If one is f
21970 6f 75 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20 74  ound, print an t
21980 68 69 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64  his. ** on stand
21990 61 72 64 20 6f 75 74 70 75 74 20 75 73 69 6e 67  ard output using
219a0 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
219b0 6e 67 20 67 69 76 65 6e 20 61 6e 64 20 72 65 74  ng given and ret
219c0 75 72 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68  urn 1.. ** If th
219d0 65 72 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c  ere are no confl
219e0 69 63 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65  icting locks, re
219f0 74 75 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74  turn 0.. */.stat
21a00 69 63 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63  ic int unixIsLoc
21a10 6b 65 64 28 0a 20 20 70 69 64 5f 74 20 70 69 64  ked(.  pid_t pid
21a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
21a30 50 49 44 20 74 6f 20 74 65 73 74 20 66 6f 72 20  PID to test for 
21a40 6c 6f 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20  lock owner */.  
21a50 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
21a60 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
21a70 73 63 72 69 70 74 6f 72 20 74 6f 20 63 68 65 63  scriptor to chec
21a80 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c  k */.  int type,
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21aa0 46 5f 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c  F_RDLCK or F_WRL
21ab0 43 4b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  CK */.  unsigned
21ac0 20 69 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a   int iOfst,   /*
21ad0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
21ae0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  he lock */.  uns
21af0 69 67 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c 20  igned int iCnt, 
21b00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21b10 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
21b20 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e  k range */.  con
21b30 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
21b40 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f     /* Type of lo
21b50 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
21b60 74 20 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e  t flock lk;.  in
21b70 74 20 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73  t err;.  .  mems
21b80 65 74 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f  et(&lk, 0, sizeo
21b90 66 28 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74  f(lk));.  lk.l_t
21ba0 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b  ype = type;.  lk
21bb0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
21bc0 5f 53 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61  _SET;.  lk.l_sta
21bd0 72 74 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b  rt = iOfst;.  lk
21be0 2e 6c 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20  .l_len = iCnt;. 
21bf0 20 0a 20 20 69 66 28 20 70 69 64 21 3d 53 51 4c   .  if( pid!=SQL
21c00 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e  ITE_LOCKSTATE_AN
21c10 59 50 49 44 20 29 7b 0a 23 69 66 6e 64 65 66 20  YPID ){.#ifndef 
21c20 46 5f 47 45 54 4c 4b 50 49 44 0a 23 20 77 61 72  F_GETLKPID.# war
21c30 6e 69 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44 20  ning F_GETLKPID 
21c40 75 6e 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69  undefined, _sqli
21c50 74 65 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61  te3_lockstate fa
21c60 6c 6c 69 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f  lling back to F_
21c70 47 45 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20  GETLK.    err = 
21c80 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b  fcntl(h, F_GETLK
21c90 2c 20 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20  , &lk);.#else.  
21ca0 20 20 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64    lk.l_pid = pid
21cb0 3b 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74  ;.    err = fcnt
21cc0 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c  l(h, F_GETLKPID,
21cd0 20 26 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20   &lk);.#endif.  
21ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 65 72 72 20 3d  }else{.    err =
21cf0 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c   fcntl(h, F_GETL
21d00 4b 2c 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a  K, &lk);.  }.  .
21d10 20 20 69 66 28 20 65 72 72 3d 3d 28 2d 31 29 20    if( err==(-1) 
21d20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
21d30 74 64 65 72 72 2c 20 22 66 63 6e 74 6c 28 25 64  tderr, "fcntl(%d
21d40 29 20 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d  ) failed: errno=
21d50 25 64 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29  %d\n", h, errno)
21d60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
21d70 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b  .  }.  .  if( lk
21d80 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
21d90 20 26 26 20 28 70 69 64 3d 3d 53 51 4c 49 54 45   && (pid==SQLITE
21da0 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49  _LOCKSTATE_ANYPI
21db0 44 20 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70  D || lk.l_pid==p
21dc0 69 64 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51  id) ){.#ifdef SQ
21dd0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66  LITE_DEBUG.    f
21de0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21df0 25 73 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20  %s lock held by 
21e00 25 64 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69  %d\n", zType, (i
21e10 6e 74 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65  nt)lk.l_pid);.#e
21e20 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
21e30 31 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e  1;.  } .  return
21e40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
21e50 73 20 74 65 73 74 20 6f 6e 6c 79 20 77 6f 72 6b  s test only work
21e60 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65 73 74 69  s for lock testi
21e70 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f 73 69 78  ng on unix/posix
21e80 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70 74 65 64   VFS..** Adapted
21e90 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f   from tool/getlo
21ea0 63 6b 2e 63 20 66 34 63 33 39 62 36 35 31 33 37  ck.c f4c39b65137
21eb0 30 31 35 36 63 61 65 39 37 39 35 30 31 61 37 62  0156cae979501a7b
21ec0 31 35 36 62 64 62 61 35 30 65 37 63 65 0a 2a 2f  156bdba50e7ce.*/
21ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21ee0 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 75 6e 69  LockstatePid(uni
21ef0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 70 69  xFile *pFile, pi
21f00 64 5f 74 20 70 69 64 2c 20 69 6e 74 20 2a 70 4c  d_t pid, int *pL
21f10 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20 69 6e 74  ockstate){.  int
21f20 20 68 44 62 3b 20 20 20 20 20 20 20 20 2f 2a 20   hDb;        /* 
21f30 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
21f40 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 64 61 74  for the open dat
21f50 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
21f60 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31 3b 20 20  int hShm = -1;  
21f70 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
21f80 6f 72 20 66 6f 72 20 57 41 4c 20 73 68 61 72 65  or for WAL share
21f90 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
21fa0 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f 74 3b 20  .  ssize_t got; 
21fb0 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 61 64     /* Bytes read
21fc0 20 66 72 6f 6d 20 68 65 61 64 65 72 20 2a 2f 0a   from header */.
21fd0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ff0 54 72 75 65 20 69 66 20 69 6e 20 57 41 4c 20 6d  True if in WAL m
22000 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
22010 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ck = 0;         
22020 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22030 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
22040 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
22050 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 44  Hdr[100];   /* D
22060 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 2a  atabase header *
22070 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70 4c  /.  .  assert(pL
22080 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20 20  ockstate);.  .  
22090 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  /* make sure we 
220a0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
220b0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
220c0 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46 69 6c   */.  hDb = pFil
220d0 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44 62 3c  e->h;.  if( hDb<
220e0 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73  0 ){.    *pLocks
220f0 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f  tate = SQLITE_LO
22100 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20  CKSTATE_ERROR;. 
22110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22120 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
22130 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28 53 51  sert( (strlen(SQ
22140 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  LITE_FILE_HEADER
22150 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49 4c  )+1)==SQLITE_FIL
22160 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b 0a  E_HEADER_LEN );.
22170 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 68 44    got = pread(hD
22180 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20 30 29  b, aHdr, 100, 0)
22190 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
221a0 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65  .    *pLockstate
221b0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
221c0 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ATE_ERROR;.    r
221d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
221e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f  OR;.  }.  if( go
221f0 74 21 3d 31 30 30 20 7c 7c 20 6d 65 6d 63 6d 70  t!=100 || memcmp
22200 28 61 48 64 72 2c 20 53 51 4c 49 54 45 5f 46 49  (aHdr, SQLITE_FI
22210 4c 45 5f 48 45 41 44 45 52 2c 20 53 51 4c 49 54  LE_HEADER, SQLIT
22220 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45  E_FILE_HEADER_LE
22230 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 4c  N)!=0 ){.    *pL
22240 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
22250 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54 41  E_LOCKSTATE_NOTA
22260 44 42 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  DB;.    return S
22270 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
22280 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73 74 20  }.  .  /* First 
22290 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 63  check for an exc
222a0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
222b0 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73   nLock += unixIs
222c0 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c  Locked(pid, hDb,
222d0 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45 44   F_RDLCK, SHARED
222e0 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
222f0 49 5a 45 2c 20 22 45 58 43 4c 55 53 49 56 45 22  IZE, "EXCLUSIVE"
22300 29 3b 0a 20 20 69 73 57 61 6c 20 3d 20 61 48 64  );.  isWal = aHd
22310 72 5b 31 38 5d 3d 3d 32 3b 0a 20 20 69 66 28 20  r[18]==2;.  if( 
22320 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61  nLock==0 && isWa
22330 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52  l==0 ){.    /* R
22340 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a  ollback mode */.
22350 20 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69      nLock += uni
22360 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
22370 44 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e  Db, F_WRLCK, PEN
22380 44 49 4e 47 5f 42 59 54 45 2c 20 53 48 41 52 45  DING_BYTE, SHARE
22390 44 5f 53 49 5a 45 2b 32 2c 20 22 50 45 4e 44 49  D_SIZE+2, "PENDI
223a0 4e 47 7c 52 45 53 45 52 56 45 44 7c 53 48 41 52  NG|RESERVED|SHAR
223b0 45 44 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ED");.  }.  if( 
223c0 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61  nLock==0 && isWa
223d0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  l!=0 ){.    /* l
223e0 6f 6f 6b 75 70 20 74 68 65 20 66 69 6c 65 20 64  ookup the file d
223f0 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
22400 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
22410 66 69 6c 65 20 69 66 20 77 65 20 68 61 76 65 20  file if we have 
22420 69 74 20 6f 70 65 6e 20 69 6e 20 74 68 69 73 20  it open in this 
22430 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 75  process */.    u
22440 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
22450 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
22460 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
22470 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
22480 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68  ds */.    unixSh
22490 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
224a0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
224b0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69  >pShmNode;.    i
224c0 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
224d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
224e0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
224f0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
22500 20 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20 70   .      hShm = p
22510 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20  ShmNode->h;.    
22520 20 20 69 66 28 20 68 53 68 6d 20 3e 3d 20 30 29    if( hShm >= 0)
22530 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  {.        if( un
22540 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
22550 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
22560 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22  HM_RECOVER, 1, "
22570 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c  WAL-RECOVERY") |
22580 7c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  |.           uni
22590 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
225a0 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
225b0 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c  M_WRITE, 1, "WAL
225c0 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20  -WRITE") ){.    
225d0 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b        nLock = 1;
225e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
225f0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
22600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
22610 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
22620 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  tex);.    } .   
22630 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30   .    if( hShm<0
22640 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68 65   ){.      /* the
22650 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66   shared memory f
22660 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e 20 69  ile isn't open i
22670 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 73  n this process s
22680 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72 20 6f  pace, open our o
22690 77 6e 20 46 44 20 2a 2f 0a 20 20 20 20 20 20 63  wn FD */.      c
226a0 68 61 72 20 7a 53 68 6d 5b 4d 41 58 50 41 54 48  har zShm[MAXPATH
226b0 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 0a 20 20 20  LEN];.      .   
226c0 20 20 20 2f 2a 20 57 41 4c 20 6d 6f 64 65 20 2a     /* WAL mode *
226d0 2f 0a 20 20 20 20 20 20 73 74 72 6c 63 70 79 28  /.      strlcpy(
226e0 7a 53 68 6d 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  zShm, pFile->zPa
226f0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
22700 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74 28 7a  .      strlcat(z
22710 53 68 6d 2c 20 22 2d 73 68 6d 22 2c 20 4d 41 58  Shm, "-shm", MAX
22720 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
22730 68 53 68 6d 20 3d 20 6f 70 65 6e 28 7a 53 68 6d  hShm = open(zShm
22740 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
22750 20 20 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30        if( hShm<0
22760 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 6f   ){.        *pLo
22770 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckstate = SQLITE
22780 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a  _LOCKSTATE_OFF;.
22790 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76          unixLeav
227a0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
227b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
227c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
227d0 20 20 69 66 28 20 75 6e 69 78 49 73 4c 6f 63 6b    if( unixIsLock
227e0 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f  ed(pid, hShm, F_
227f0 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43 4f 56  RDLCK, SHM_RECOV
22800 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45 43 4f  ER, 1, "WAL-RECO
22810 56 45 52 59 22 29 20 7c 7c 0a 20 20 20 20 20 20  VERY") ||.      
22820 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28     unixIsLocked(
22830 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c  pid, hShm, F_RDL
22840 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45 2c 20 31  CK, SHM_WRITE, 1
22850 2c 20 22 57 41 4c 2d 57 52 49 54 45 22 29 20 29  , "WAL-WRITE") )
22860 7b 0a 20 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20  {.        nLock 
22870 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
22880 20 20 20 63 6c 6f 73 65 28 68 53 68 6d 29 3b 0a     close(hShm);.
22890 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
228a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
228b0 20 20 69 66 28 20 6e 4c 6f 63 6b 3e 30 20 29 7b    if( nLock>0 ){
228c0 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65  .    *pLockstate
228d0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
228e0 41 54 45 5f 4f 4e 3b 0a 20 20 7d 20 65 6c 73 65  ATE_ON;.  } else
228f0 20 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61   {.    *pLocksta
22900 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
22910 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 7d 0a 20  STATE_OFF;.  }. 
22920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22930 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
22940 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
22950 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
22960 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
22970 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ) */.../*.** If 
22980 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
22990 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
229a0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
229b0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
229c0 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
229d0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
229e0 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
229f0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
22a00 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
22a10 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
22a20 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
22a30 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
22a40 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
22a50 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
22a60 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
22a70 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
22a80 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
22a90 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
22aa0 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
22ab0 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
22ac0 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
22ad0 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
22ae0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
22af0 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
22b00 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
22b10 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
22b20 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
22b30 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
22b40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
22b50 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
22b60 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
22b70 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
22b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22b90 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
22ba0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
22bb0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
22bc0 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
22bd0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
22be0 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
22bf0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
22c00 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
22c10 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
22c20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
22c30 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
22c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22c50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
22c60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
22c70 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
22c80 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
22c90 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
22ca0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22cc0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22cd0 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
22ce0 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
22cf0 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
22d00 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
22d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22d20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22d30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
22d40 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
22d50 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69  int rc;.      Si
22d60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
22d70 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
22d80 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74   = fcntlSizeHint
22d90 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29  (pFile, *(i64 *)
22da0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d  pArg);.      Sim
22db0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
22dc0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74  gn(0);.      ret
22dd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22de0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
22df0 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
22e00 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
22e10 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
22e20 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
22e30 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
22e40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22e50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
22e60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
22e70 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TL_POWERSAFE_OVE
22e80 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  RWRITE: {.      
22e90 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
22ea0 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  e, UNIXFILE_PSOW
22eb0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
22ec0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22ed0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
22ee0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
22ef0 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
22f00 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
22f10 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
22f20 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d  ntf("%s", pFile-
22f30 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pVfs->zName);. 
22f40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22f50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
22f60 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
22f70 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
22f80 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
22f90 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
22fa0 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
22fb0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
22fc0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
22fd0 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
22fe0 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
22ff0 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
23000 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
23010 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
23020 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
23030 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
23040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
23050 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
23060 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
23070 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
23080 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
23090 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
230a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
230b0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
230c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
230d0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
230e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
230f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
23100 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
23110 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
23120 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54  SQLITE_FCNTL_GET
23130 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
23140 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
23150 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
23160 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
23170 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
23180 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
23190 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
231a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
231b0 2f 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e  /.#if (SQLITE_EN
231c0 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
231d0 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
231e0 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
231f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52   SQLITE_FCNTL_TR
23200 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a  UNCATE_DATABASE:
23210 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
23220 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61  unixTruncateData
23230 62 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41 72  base(pFile, (pAr
23240 67 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41 72  g ? (*(int *)pAr
23250 67 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d 0a  g) : 0));.    }.
23260 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23270 46 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44 41  FCNTL_REPLACE_DA
23280 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  TABASE: {.      
23290 72 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c 61  return unixRepla
232a0 63 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65  ceDatabase(pFile
232b0 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 72  , (sqlite3 *)pAr
232c0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  g);.    }.    ca
232d0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
232e0 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20 7b  LOCKSTATE_PID: {
232f0 0a 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74 65  .      Lockstate
23300 50 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65 3b  PID *pLockstate;
23310 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
23320 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
23330 70 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pArg==NULL ){.  
23340 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23350 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20  ITE_MISUSE;.    
23360 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 73    }.      pLocks
23370 74 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61 74  tate = (Lockstat
23380 65 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20 20  ePID *)pArg;.   
23390 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b     rc = unixLock
233a0 73 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c 20  statePid(pFile, 
233b0 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64 2c  pLockstate->pid,
233c0 20 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 73   &(pLockstate->s
233d0 74 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72 65  tate));.      re
233e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
233f0 20 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20       .#endif /* 
23400 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
23410 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
23420 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
23430 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ) */.    case SQ
23440 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f  LITE_FCNTL_SYNC_
23450 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20  OMITTED: {.     
23460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23470 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a  K;  /* A no-op *
23480 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
23490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
234a0 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
234b0 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
234c0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
234d0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
234e0 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
234f0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
23500 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
23510 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
23520 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
23530 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
23540 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
23550 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
23560 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
23570 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
23580 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
23590 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
235a0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
235b0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
235c0 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
235d0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
235e0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
235f0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
23600 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
23610 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
23620 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
23630 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
23640 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
23650 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
23660 2a 70 46 69 6c 65 29 7b 0a 20 20 28 76 6f 69 64  *pFile){.  (void
23670 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
23680 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
23690 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
236a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
236b0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
236c0 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
236d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
236e0 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
236f0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
23700 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
23710 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
23720 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
23730 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
23740 20 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73   contraversial s
23750 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
23760 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
23770 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
23780 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
23790 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
237a0 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
237b0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
237c0 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
237d0 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
237e0 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
237f0 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
23800 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
23810 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
23820 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
23830 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
23840 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
23850 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
23860 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
23870 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
23880 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
23890 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
238a0 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
238b0 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
238c0 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
238d0 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
238e0 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
238f0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
23900 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
23910 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
23920 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
23930 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
23940 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
23950 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
23960 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
23970 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
23980 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
23990 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
239a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
239b0 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
239c0 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  p = (unixFile*)i
239d0 64 3b 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c  d;.  if( p->ctrl
239e0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
239f0 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 65 74  _PSOW ){.    ret
23a00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
23a10 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
23a20 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
23a30 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
23a40 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
23a50 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a  TE_OMIT_WAL.../*
23a60 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
23a70 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
23a80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
23a90 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
23aa0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
23ab0 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
23ac0 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
23ad0 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
23ae0 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
23af0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
23b00 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
23b10 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
23b20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
23b30 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
23b40 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
23b50 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
23b60 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
23b70 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
23b80 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
23b90 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
23ba0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
23bb0 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
23bc0 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
23bd0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
23be0 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
23bf0 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
23c00 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
23c10 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
23c20 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
23c30 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
23c40 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
23c50 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
23c60 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
23c70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
23c80 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
23c90 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
23ca0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
23cb0 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
23cc0 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
23cd0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
23ce0 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
23cf0 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
23d00 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
23d10 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
23d20 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
23d30 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
23d40 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
23d50 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
23d60 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
23d70 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
23d80 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
23d90 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
23da0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
23db0 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
23dc0 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
23dd0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
23de0 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
23df0 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
23e00 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
23e10 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
23e20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
23e30 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53  .** Either unixS
23e40 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
23e50 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
23e60 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
23e70 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
23e80 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
23e90 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
23ea0 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
23eb0 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
23ec0 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
23ed0 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
23ee0 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
23ef0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
23f00 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
23f10 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
23f20 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
23f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
23f40 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
23f50 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
23f60 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
23f70 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
23f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
23f90 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
23fa0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
23fb0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23fc0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
23fd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
23fe0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
23ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24000 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
24010 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
24020 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
24030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24040 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
24050 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
24060 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
24070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24080 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
24090 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67  /.  char **apReg
240a0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ion;           /
240b0 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65  * Array of mappe
240c0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
240d0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
240e0 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
240f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24100 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a  r of unixShm obj
24110 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
24120 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53   this */.  unixS
24130 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
24140 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69        /* All uni
24150 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
24160 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
24170 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
24180 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61  EBUG.  u8 exclMa
24190 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
241a0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
241b0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
241c0 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64  d */.  u8 shared
241d0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
241e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
241f0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
24200 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  /.  u8 nextShmId
24210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24220 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
24230 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75   unixShm.id valu
24240 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
24250 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
24260 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
24270 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
24280 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
24290 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
242a0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
242b0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
242c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
242d0 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
242e0 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
242f0 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
24300 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
24310 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
24320 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  **.**    unixShm
24330 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69  .pFile.**    uni
24340 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  xShm.id.**.** Al
24350 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
24360 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
24370 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c  The unixShm.pFil
24380 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
24390 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
243a0 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
243b0 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
243c0 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
243d0 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  m {.  unixShmNod
243e0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
243f0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
24400 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ng unixShmNode o
24410 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53  bject */.  unixS
24420 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
24430 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
24440 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  ixShm with the s
24450 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ame unixShmNode 
24460 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
24470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24480 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
24490 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ng the unixShmNo
244a0 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38  de mutex */.  u8
244b0 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
244c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
244d0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
244e0 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
244f0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31  xShmNode */.  u1
24500 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
24510 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
24520 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
24530 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
24540 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
24550 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
24560 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
24570 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   held */.};../*.
24580 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
24590 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
245a0 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
245b0 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
245c0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
245d0 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  4)         /* fi
245e0 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
245f0 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
24600 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53  M_DMS    (UNIX_S
24610 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
24620 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
24630 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
24640 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
24650 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
24660 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
24670 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67  from ofst throug
24680 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a  h ofst+n-1..**.*
24690 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66  * Locks block if
246a0 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61   the mask is exa
246b0 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20  ctly UNIX_SHM_C 
246c0 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
246d0 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
246e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
246f0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
24700 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  ck(.  unixShmNod
24710 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20  e *pShmNode, /* 
24720 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
24730 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
24740 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
24750 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
24760 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
24770 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
24780 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
24790 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
247a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
247b0 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
247c0 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
247d0 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
247e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
247f0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
24800 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
24810 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f  flock f;       /
24820 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
24830 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
24840 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
24850 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
24860 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
24870 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
24880 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
24890 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
248a0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
248b0 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
248c0 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
248d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
248e0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
248f0 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
24900 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
24910 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
24920 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
24930 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
24940 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
24950 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
24960 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
24970 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
24980 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
24990 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
249a0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
249b0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
249c0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
249d0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
249e0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
249f0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
24a00 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
24a10 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
24a20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
24a30 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
24a40 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
24a50 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
24a60 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
24a70 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
24a80 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
24a90 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
24aa0 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
24ab0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
24ac0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
24ad0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
24ae0 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
24af0 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
24b00 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
24b10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
24b20 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
24b30 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
24b40 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31  "));.  mask = (1
24b50 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
24b60 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
24b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24b80 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
24b90 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
24ba0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
24bb0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
24bc0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
24bd0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
24be0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
24bf0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
24c00 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
24c10 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
24c20 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
24c30 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
24c40 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
24c50 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
24c60 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
24c70 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
24c80 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
24c90 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
24ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24cb0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
24cc0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
24cd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
24ce0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
24cf0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
24d00 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
24d10 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
24d20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
24d30 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
24d40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
24d50 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
24d60 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
24d70 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
24d80 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
24d90 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
24da0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
24db0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
24dc0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
24dd0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
24de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24df0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
24e00 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
24e10 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
24e20 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
24e30 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
24e40 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
24e50 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
24e60 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
24e70 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
24e80 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
24e90 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
24ea0 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
24eb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
24ec0 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20       .}.../*.** 
24ed0 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
24ee0 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
24ef0 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
24f00 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
24f10 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
24f20 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
24f30 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
24f40 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
24f50 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
24f60 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
24f70 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
24f80 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
24f90 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
24fa0 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
24fb0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
24fc0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
24fd0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
24fe0 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
24ff0 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
25000 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
25010 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
25020 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
25030 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
25040 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
25050 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
25060 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
25070 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
25080 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
25090 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
250a0 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70      munmap(p->ap
250b0 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
250c0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
250d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
250e0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
250f0 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
25100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
25110 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
25120 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
25130 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
25140 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
25150 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
25160 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
25170 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
25180 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
25190 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
251a0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
251b0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  }.}..static cons
251c0 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61  t char *proxySha
251d0 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
251e0 68 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 0a  h(unixFile *);..
251f0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
25200 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
25210 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25220 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
25230 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
25240 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
25250 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
25260 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
25270 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
25280 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
25290 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
252a0 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
252b0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
252c0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
252d0 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
252e0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
252f0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
25300 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
25310 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
25320 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
25330 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
25340 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
25350 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
25360 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
25370 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
25380 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
25390 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
253a0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
253b0 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
253c0 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
253d0 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
253e0 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
253f0 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
25400 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
25410 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
25420 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
25430 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
25440 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
25450 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
25460 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
25470 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
25480 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
25490 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
254a0 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
254b0 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
254c0 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
254d0 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
254e0 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
254f0 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
25500 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
25510 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
25520 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
25530 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
25540 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
25550 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
25560 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
25570 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
25580 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
25590 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
255a0 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
255b0 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
255c0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
255d0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
255e0 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
255f0 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
25600 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
25610 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
25620 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
25630 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
25640 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
25650 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
25660 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
25670 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
25680 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
25690 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
256a0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
256b0 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
256c0 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
256d0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
256e0 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
256f0 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
25700 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
25710 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
25720 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
25730 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
25740 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
25750 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
25760 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
25770 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
25780 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
25790 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
257a0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
257b0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
257c0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
257d0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
257e0 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
257f0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
25800 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
25810 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
25820 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
25830 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
25840 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
25850 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
25860 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
25870 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
25880 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
25890 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
258a0 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
258b0 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
258c0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
258d0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
258e0 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
258f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
25900 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
25910 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
25920 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
25930 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
25940 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
25950 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
25960 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
25970 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
25980 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
25990 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
259a0 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
259b0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
259c0 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
259d0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
259e0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
259f0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
25a00 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
25a10 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
25a20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
25a30 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
25a40 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
25a50 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
25a60 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
25a70 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
25a80 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
25a90 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
25ac0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
25ad0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
25ae0 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
25af0 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
25b00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
25b10 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
25b20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25b30 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
25b40 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
25b50 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
25b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
25b70 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
25b80 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
25b90 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
25ba0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
25bb0 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
25bc0 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
25bd0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
25be0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
25bf0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
25c00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
25c10 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
25c20 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
25c30 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
25c40 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
25c50 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
25c60 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
25c70 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
25c80 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
25c90 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
25ca0 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
25cb0 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
25cc0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
25cd0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
25ce0 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
25cf0 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
25d00 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
25d10 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
25d20 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
25d30 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
25d40 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
25d50 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
25d60 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
25d70 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
25d80 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
25d90 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
25da0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
25db0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25dc0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
25dd0 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
25de0 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
25df0 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
25e00 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
25e10 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
25e20 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  me permissions. 
25e30 54 68 65 20 61 63 74 75 61 6c 20 70 65 72 6d 69  The actual permi
25e40 73 73 69 6f 6e 73 20 74 68 65 20 66 69 6c 65 20  ssions the file 
25e50 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 2a  is created.    *
25e60 2a 20 77 69 74 68 20 61 72 65 20 73 75 62 6a 65  * with are subje
25e70 63 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ct to the curren
25e80 74 20 75 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e  t umask setting.
25e90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25ea0 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
25eb0 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
25ec0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
25ed0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
25ee0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
25ef0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
25f00 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
25f10 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 6e 73 74      }..    const
25f20 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68   char *zBasePath
25f30 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b   = pDbFd->zPath;
25f40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
25f50 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
25f60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
25f70 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 49 66  _STYLE.    /* If
25f80 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66 69 67   pDbFd is config
25f90 75 72 65 64 20 77 69 74 68 20 70 72 6f 78 79 20  ured with proxy 
25fa0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73  locking mode, us
25fb0 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20  e the local .   
25fc0 20 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20 70    ** lock file p
25fd0 61 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ath to determine
25fe0 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20 70   the -shm file p
25ff0 61 74 68 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ath.     */.    
26000 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69  if( isProxyLocki
26010 6e 67 4d 6f 64 65 28 70 44 62 46 64 29 20 29 7b  ngMode(pDbFd) ){
26020 0a 20 20 20 20 20 20 7a 42 61 73 65 50 61 74 68  .      zBasePath
26030 20 3d 20 70 72 6f 78 79 53 68 61 72 65 64 4d 65   = proxySharedMe
26040 6d 6f 72 79 42 61 73 65 50 61 74 68 28 70 44 62  moryBasePath(pDb
26050 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Fd);.      if( !
26060 7a 42 61 73 65 50 61 74 68 20 29 7b 0a 20 20 20  zBasePath ){.   
26070 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26080 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
26090 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
260a0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
260b0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
260c0 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
260d0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
260e0 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
260f0 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54  e = sizeof(SQLIT
26100 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29  E_SHM_DIRECTORY)
26110 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20   + 31;.#else.   
26120 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
26130 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  6 + (int)strlen(
26140 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64  zBasePath);.#end
26150 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  if.    pShmNode 
26160 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
26170 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
26180 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61  de) + nShmFilena
26190 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  me );.    if( pS
261a0 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
261b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
261c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
261d0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
261e0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
261f0 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
26200 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b  eof(*pShmNode));
26210 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  .    zShmFilenam
26220 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  e = pShmNode->zF
26230 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
26240 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23  )&pShmNode[1];.#
26250 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
26260 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73  _DIRECTORY.    s
26270 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
26280 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
26290 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20  hmFilename, .   
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
262c0 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
262d0 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
26300 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
26310 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
26320 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
26330 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
26340 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22   zShmFilename, "
26350 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61  %s-shm", zBasePa
26360 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
26370 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
26380 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69  d->zPath, zShmFi
26390 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
263a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
263b0 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
263c0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
263d0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
263e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
263f0 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
26400 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
26410 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
26420 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
26430 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
26440 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
26450 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
26460 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26470 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
26480 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
26490 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
264a0 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
264b0 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
264c0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
264d0 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
264e0 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  AT;.      if( sq
264f0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
26500 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  n(pDbFd->zPath, 
26510 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20  "readonly_shm", 
26520 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  0) ){.        op
26530 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e  enFlags = O_RDON
26540 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d  LY;.        pShm
26550 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
26560 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
26570 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
26580 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53  = robust_open(zS
26590 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e  hmFilename, open
265a0 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74  Flags, (sStat.st
265b0 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20  _mode&0777));.  
265c0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
265d0 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->h<0 ){.       
265e0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
265f0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
26600 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
26610 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
26620 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
26630 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
26640 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43   }.  .      /* C
26650 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
26660 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
26670 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
26680 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
26690 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
266a0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
266b0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
266c0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
266d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
266e0 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
266f0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
26700 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
26710 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
26720 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
26730 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
26740 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
26750 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
26760 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
26770 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
26780 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
26790 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
267a0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
267b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
267c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e         /* If run
267d0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74  ning as root set
267e0 20 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20   the uid/gid of 
267f0 74 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20  the shm file to 
26800 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61  match the databa
26810 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  se */.          
26820 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74  uid_t euid = get
26830 65 75 69 64 28 29 3b 0a 20 20 20 20 20 20 20 20  euid();.        
26840 20 20 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26    if( euid==0 &&
26850 20 28 65 75 69 64 21 3d 73 53 74 61 74 2e 73 74   (euid!=sStat.st
26860 5f 75 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28  _uid || getegid(
26870 29 21 3d 73 53 74 61 74 2e 73 74 5f 67 69 64 29  )!=sStat.st_gid)
26880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26890 69 66 28 20 66 63 68 6f 77 6e 28 70 53 68 6d 4e  if( fchown(pShmN
268a0 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74  ode->h, sStat.st
268b0 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67  _uid, sStat.st_g
268c0 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  id) ){.         
268d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
268e0 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a  _IOERR_SHMOPEN;.
268f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26910 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26920 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
26940 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
26950 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
26960 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_RDLCK, UNIX_SH
26970 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
26980 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
26990 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
269a0 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  err;.    }.  }..
269b0 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
269c0 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
269d0 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78  hild of the unix
269e0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
269f0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
26a00 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
26a10 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
26a20 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
26a30 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
26a40 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
26a50 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
26a60 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
26a70 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
26a80 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
26a90 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
26aa0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
26ab0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
26ac0 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
26ad0 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45  ver of the unixE
26ae0 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
26af0 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
26b00 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
26b10 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78  new (struct unix
26b20 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
26b30 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
26b40 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
26b50 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
26b60 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
26b70 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
26b80 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
26b90 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
26ba0 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
26bb0 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
26bc0 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
26bd0 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
26be0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
26bf0 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
26c00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
26c10 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
26c20 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
26c30 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
26c40 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
26c50 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
26c60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
26c70 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
26c80 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
26c90 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
26ca0 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
26cb0 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
26cc0 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d  n_err:.  unixShm
26cd0 50 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20  Purge(pDbFd);   
26ce0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
26cf0 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
26d00 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
26d10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
26d20 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
26d30 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
26d40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
26d50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26d60 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
26d70 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
26d80 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
26d90 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f   .** shared-memo
26da0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
26db0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
26dc0 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d  file fd. Shared-
26dd0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a  memory regions .
26de0 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ** are numbered 
26df0 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65  starting from ze
26e00 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d  ro. Each shared-
26e10 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73  memory region is
26e20 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79   szRegion .** by
26e30 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
26e40 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
26e50 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
26e60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26e70 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
26e80 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
26e90 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
26ea0 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74   bExtend paramet
26eb0 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
26ec0 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
26ed0 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
26ee0 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
26ef0 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
26f00 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
26f10 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
26f20 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
26f30 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
26f40 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
26f50 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
26f60 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a  returned. If .**
26f70 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d   bExtend is non-
26f80 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
26f90 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
26fa0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
26fb0 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e  not yet .** been
26fc0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
26fd0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
26fe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
26ff0 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
27000 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
27010 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
27020 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
27030 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
27040 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
27050 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
27060 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
27070 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
27080 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73  sses .** address
27090 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
270a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
270b0 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
270c0 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
270d0 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
270e0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
270f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
27100 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20  t unixShmMap(.  
27110 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
27120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27130 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
27140 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
27150 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
27160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27170 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
27180 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
27190 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
271c0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74  ns */.  int bExt
271d0 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  end,            
271e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
271f0 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
27200 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
27210 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
27220 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
27230 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
27240 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75  memory */.){.  u
27250 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
27260 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
27270 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20    unixShm *p;.  
27280 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
27290 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
272a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
272b0 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  /* If the shared
272c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73  -memory file has
272d0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
272e0 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
272f0 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46  w. */.  if( pDbF
27300 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20  d->pShm==0 ){.  
27310 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53    rc = unixOpenS
27320 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
27330 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
27340 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
27350 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20  rn rc;.  }..  p 
27360 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
27370 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
27380 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  ShmNode;.  sqlit
27390 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
273a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
273b0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
273c0 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
273d0 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
273e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
273f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
27400 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
27410 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
27420 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
27430 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
27440 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
27450 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
27460 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
27470 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
27480 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
27490 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Lock==0 );..  if
274a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
274b0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
274c0 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77      char **apNew
274d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
274e0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70         /* New ap
274f0 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
27500 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
27510 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
27520 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
27530 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
27540 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
27550 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61   /* Used by fsta
27580 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  t() */..    pShm
27590 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
275a0 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
275b0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
275c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
275d0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
275e0 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65  ion is not mappe
275f0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
27600 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
27610 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ace..      ** Ch
27620 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
27630 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
27640 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
27650 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
27660 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  is.      ** larg
27670 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
27680 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
27690 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20  d region)..     
276a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73   */.      if( os
276b0 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fstat(pShmNode->
276c0 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
276d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
276e0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b  E_IOERR_SHMSIZE;
276f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
27700 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
27710 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
27720 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42  sStat.st_size<nB
27730 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  yte ){.        /
27740 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
27750 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
27760 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
27770 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20   bExtend is set 
27780 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  to.        ** fa
27790 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  lse, exit early.
277a0 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
277b0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
277c0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
277d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
277e0 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
277f0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
27800 20 69 73 20 74 72 75 65 2c 20 75 73 65 20 66 74   is true, use ft
27810 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c  runcate() to all
27820 6f 63 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  ocate.        **
27830 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
27840 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
27850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27860 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 20   if( !bExtend ) 
27870 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
27880 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f  ;.        if( ro
27890 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
278a0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74  ShmNode->h, nByt
278b0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
278c0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
278d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
278e0 48 4d 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61  HMSIZE, "ftrunca
278f0 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  te",.           
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27910 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
27920 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
27930 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
27940 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
27950 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
27960 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
27970 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
27980 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
27990 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
279a0 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
279b0 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ew = (char **)sq
279c0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
279d0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
279e0 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  >apRegion, (iReg
279f0 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68  ion+1)*sizeof(ch
27a00 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20  ar *).    );.   
27a10 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
27a20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27a30 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
27a40 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
27a50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
27a60 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
27a70 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
27a80 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  while(pShmNode->
27a90 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
27aa0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
27ab0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
27ac0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
27ad0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
27ae0 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e  mmap(0, szRegion
27af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ,.            pS
27b00 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
27b10 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a  ly ? PROT_READ :
27b20 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
27b30 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
27b40 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20      MAP_SHARED, 
27b50 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68  pShmNode->h, pSh
27b60 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
27b70 7a 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20  zRegion.        
27b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
27b90 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
27ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
27bb0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
27bc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
27bd0 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d  AP, "mmap", pShm
27be0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
27bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
27c00 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
27c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
27c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
27c30 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  m = sqlite3_mall
27c40 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  oc(szRegion);.  
27c50 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
27c60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
27c70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27c80 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
27c90 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
27ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27cb0 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
27cc0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
27cd0 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
27ce0 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
27cf0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d  Node->nRegion] =
27d00 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68   pMem;.      pSh
27d10 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
27d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
27d30 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
27d40 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
27d50 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
27d60 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
27d70 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
27d80 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
27d90 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
27da0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
27db0 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
27dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
27dd0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
27de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
27df0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
27e00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
27e10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27e20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
27e30 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
27e40 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
27e50 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
27e60 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
27e70 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
27e80 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
27e90 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
27ea0 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
27eb0 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
27ec0 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
27ed0 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
27ee0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
27ef0 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
27f00 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
27f10 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
27f20 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
27f30 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
27f40 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
27f50 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
27f60 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
27f70 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
27f80 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
27f90 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
27fa0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
27fb0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
27fc0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
27fd0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
27fe0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
27ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28000 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
28010 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
28020 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28040 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
28050 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
28060 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
28070 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
28080 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
28090 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
280a0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
280b0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
280c0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
280d0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
280e0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
280f0 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
28100 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
28110 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
28120 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
28130 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
28140 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
28150 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28170 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
28180 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
28190 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
281a0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
281b0 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
281c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
281d0 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
281e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
28210 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
28240 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
28250 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
28260 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
28270 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
28280 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
28290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
282a0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
282b0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
282c0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
282d0 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
282e0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
282f0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
28300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
28310 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
28320 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
28330 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
28340 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
28350 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
28360 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
28370 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
28380 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
28390 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
283a0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
283b0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
283c0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
283d0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
283e0 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
283f0 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
28400 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
28410 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
28420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
28430 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
28440 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
28450 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
28460 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
28470 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
28480 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
28490 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
284a0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
284b0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
284c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
284d0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
284e0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
284f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
28500 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
28510 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
28520 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
28530 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
28540 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
28550 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
28560 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
28570 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
28580 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
28590 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
285a0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
285b0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
285c0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
285d0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
285e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
285f0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
28600 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
28610 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
28620 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
28630 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
28640 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
28650 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
28660 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
28670 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
28680 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
28690 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
286a0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
286b0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
286c0 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
286d0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
286e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
286f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28700 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
28710 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
28720 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
28730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28740 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
28750 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
28760 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
28770 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
28780 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
28790 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
287a0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
287b0 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
287c0 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
287d0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
287e0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
287f0 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
28800 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
28810 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
28820 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
28830 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
28840 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
28850 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
28860 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
28870 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
28880 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
28890 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
288a0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
288b0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
288c0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
288d0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
288e0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
288f0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
28900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
28910 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
28920 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
28940 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
28950 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
28960 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
28970 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
28980 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
28990 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
289a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
289b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
289c0 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
289d0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
289e0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
289f0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
28a00 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  e, F_RDLCK, ofst
28a10 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
28a20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
28a30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
28a40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
28a50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
28a60 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
28a70 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
28a80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28a90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
28aa0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
28ab0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
28ac0 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
28ad0 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
28ae0 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
28af0 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
28b00 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
28b10 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
28b20 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
28b30 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
28b40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
28b50 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
28b60 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
28b70 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
28b80 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
28b90 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
28ba0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
28bb0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
28bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28bd0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
28be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
28bf0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
28c00 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
28c10 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
28c20 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
28c30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
28c40 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
28c50 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
28c60 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
28c70 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
28c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
28ca0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
28cb0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
28cc0 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  RLCK, ofst+UNIX_
28cd0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
28ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28d00 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
28d10 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
28d20 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
28d30 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
28d40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
28d50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
28d60 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
28d70 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
28d80 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
28d90 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
28da0 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
28db0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28dc0 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
28dd0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
28de0 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
28df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28e00 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
28e10 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
28e20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
28e30 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
28e40 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
28e50 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
28e60 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
28e70 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
28e80 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
28e90 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
28ea0 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
28eb0 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
28ec0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
28ed0 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
28ee0 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
28f10 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
28f20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
28f30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28f40 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  fd);.  unixEnter
28f50 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c  Mutex();.  unixL
28f60 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
28f70 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
28f80 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
28f90 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
28fa0 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
28fb0 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
28fc0 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
28fd0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
28fe0 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
28ff0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
29000 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
29010 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
29020 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
29030 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
29040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29050 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  nixShmUnmap(.  s
29060 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29080 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
29090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
290a0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
290b0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
290c0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68      /* Delete sh
290d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74  ared-memory if t
290e0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  rue */.){.  unix
290f0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
29100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29110 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
29120 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
29130 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
29140 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
29150 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
29160 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
29170 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
29180 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
29190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
291a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
291b0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
291c0 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  s */.  unixFile 
291d0 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
291e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
291f0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
29200 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62  e file */..  pDb
29210 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
29220 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
29230 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
29240 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29250 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
29260 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
29270 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
29280 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
29290 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
292a0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
292b0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
292c0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20  d->pInode );..  
292d0 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
292e0 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
292f0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
29300 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
29310 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
29320 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
29330 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
29340 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
29350 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
29360 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
29370 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
29380 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
29390 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
293a0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
293b0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
293c0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
293d0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
293e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
293f0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
29400 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
29410 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
29420 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
29430 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
29440 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
29450 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
29460 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
29470 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
29480 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
29490 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
294a0 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
294b0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
294c0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
294d0 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
294e0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20  ShmNode->h>=0 ) 
294f0 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
29500 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
29510 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
29520 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
29530 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
29540 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29550 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
29560 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
29570 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
29580 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
29590 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
295a0 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
295b0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
295c0 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
295d0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
295e0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
295f0 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
29600 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29610 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
29620 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
29630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29640 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
29650 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
29660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
29680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
296c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
296d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
296e0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
296f0 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
29700 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29710 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
29720 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
29730 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
29740 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
29750 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
29760 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
29770 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
29780 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
29790 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
297a0 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
297b0 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
297c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
297d0 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
297e0 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
297f0 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
29800 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
29810 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
29820 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
29830 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
29840 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
29850 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
29860 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
29870 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
29880 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
29890 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
298a0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
298b0 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
298c0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
298d0 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
298e0 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
298f0 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
29900 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
29910 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
29920 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
29930 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
29940 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
29950 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
29960 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
29970 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
29980 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
29990 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
299a0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
299b0 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
299c0 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
299d0 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
299e0 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
299f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
29a00 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
29a10 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
29a20 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
29a30 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
29a40 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
29a50 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
29a60 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
29a70 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
29a80 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
29a90 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
29aa0 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
29ab0 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
29ac0 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
29ad0 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
29ae0 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
29af0 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
29b00 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
29b10 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
29b20 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
29b30 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
29b40 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
29b50 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
29b60 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
29b70 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
29b80 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
29b90 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
29ba0 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
29bb0 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
29bc0 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
29bd0 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
29be0 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
29bf0 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
29c00 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
29c10 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
29c20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
29c30 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
29c40 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
29c50 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
29c60 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44  S(FINDER, METHOD
29c70 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45  , VERSION, CLOSE
29c80 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
29c90 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73  CKLOCK)      \.s
29ca0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
29cb0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
29cc0 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29cf0 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d10 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29d40 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
29d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29d60 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29d90 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
29da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
29db0 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29de0 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
29df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
29e00 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29e30 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
29e40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
29e50 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29e80 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
29e90 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
29ea0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
29ed0 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
29ee0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
29ef0 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f30 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
29f40 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f60 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29f90 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fb0 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
29fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fd0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
29fe0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
2a010 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
2a020 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
2a030 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
2a060 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
2a070 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
2a080 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0a0 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
2a0b0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
2a0c0 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
2a0d0 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a0f0 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20  .   unixShmMap, 
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a110 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a140 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a160 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2a190 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
2a1a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2a1b0 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a1e0 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a200 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a220 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a270 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
2a280 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a290 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
2a2a0 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
2a2b0 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
2a2c0 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
2a2d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
2a2e0 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
2a2f0 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
2a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a310 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
2a320 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a360 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
2a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3b0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
2a3c0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a3d0 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
2a3e0 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
2a3f0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
2a400 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
2a410 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
2a420 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
2a430 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
2a440 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
2a450 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
2a460 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
2a470 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
2a480 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
2a490 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
2a4a0 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
2a4b0 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
2a4c0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
2a4d0 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
2a4e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2a4f0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2a500 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
2a510 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2a520 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2a530 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2a540 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20   */.  2,        
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a570 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
2a580 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
2a590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2a5a0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2a5b0 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2a5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2a5d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a5e0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
2a5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2a600 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2a610 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
2a620 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43  edLock     /* xC
2a630 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a640 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
2a650 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
2a660 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2a670 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2a680 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2a690 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
2a6a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
2a6b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a6c0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2a6d0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2a6f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2a700 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f  disabled */.  no
2a710 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
2a720 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2a730 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
2a740 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
2a750 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2a760 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
2a770 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
2a780 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2a790 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
2a7a0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
2a7b0 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63  dLock   /* xChec
2a7c0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2a7d0 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
2a7e0 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
2a7f0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a800 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a810 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
2a820 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
2a830 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a840 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a850 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2a860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a870 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a880 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a890 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
2a8a0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
2a8b0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a8c0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
2a8d0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
2a8e0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a8f0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
2a900 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
2a910 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a920 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
2a930 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
2a940 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock  /* xCheckRe
2a950 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a960 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49  d */.)..#if SQLI
2a970 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a980 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
2a990 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
2a9a0 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
2a9b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2a9c0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2a9d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
2a9e0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2a9f0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2aa00 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2aa10 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa30 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2aa40 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2aa50 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
2aa60 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2aa70 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2aa80 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
2aa90 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2aaa0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2aab0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
2aac0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2aad0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2aae0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
2aaf0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
2ab00 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2ab10 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2ab20 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2ab30 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
2ab40 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e  HODS(.  semIoFin
2ab50 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2ab60 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2ab70 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73  tion name */.  s
2ab80 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  emIoMethods,    
2ab90 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2aba0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2abb0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2abc0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2abd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2abe0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
2abf0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43  sabled */.  semC
2ac00 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2ac10 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2ac20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c  method */.  semL
2ac30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2ac40 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2ac50 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e  ethod */.  semUn
2ac60 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2ac70 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2ac80 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43  method */.  semC
2ac90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2aca0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
2acb0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2acc0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2acd0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2ace0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2acf0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2ad00 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
2ad10 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
2ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad30 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2ad40 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
2ad50 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2ad60 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2ad70 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2ad80 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ada0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2adb0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2adc0 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
2add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ade0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2adf0 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae10 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2ae20 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae40 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2ae50 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
2ae60 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
2ae70 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2ae80 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2ae90 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
2aea0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
2aeb0 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
2aec0 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
2aed0 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
2aee0 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
2aef0 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
2af00 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
2af10 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
2af20 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
2af30 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
2af40 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
2af50 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
2af60 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
2af70 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
2af80 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
2af90 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2afa0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2afb0 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
2afc0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
2afd0 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
2afe0 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
2aff0 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
2b000 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
2b010 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
2b020 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
2b030 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
2b040 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
2b050 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
2b060 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
2b070 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
2b080 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2b090 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2b0a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b0b0 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
2b0c0 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
2b0d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
2b0e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2b0f0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2b100 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
2b110 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
2b120 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2b130 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2b140 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
2b150 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
2b160 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
2b170 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
2b180 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2b190 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2b1a0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2b1b0 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
2b1c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2b1d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b1e0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2b1f0 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b210 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2b220 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72   enabled */.  pr
2b230 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
2b240 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2b250 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
2b260 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
2b270 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2b280 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2b290 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
2b2a0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2b2b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
2b2c0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
2b2d0 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
2b2e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2b2f0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2b300 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
2b310 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
2b320 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
2b330 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
2b340 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
2b350 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2b360 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2b370 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b380 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2b390 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3b0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2b3c0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
2b3d0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2b3e0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2b3f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2b400 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b420 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2b430 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2b440 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2b450 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2b460 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2b470 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2b480 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2b490 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2b4a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
2b4b0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2b4c0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2b4d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2b4e0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
2b4f0 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
2b500 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2b510 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2b520 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
2b530 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2b540 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b550 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
2b560 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2b570 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
2b580 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2b590 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
2b5a0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
2b5b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b5c0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2b5d0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2b5e0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2b5f0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2b600 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2b610 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2b620 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2b630 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
2b640 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b650 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b660 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2b670 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2b680 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2b690 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2b6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2b6b0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2b6c0 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2b6d0 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2b6e0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2b6f0 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
2b700 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2b710 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
2b720 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2b730 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
2b740 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
2b750 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
2b760 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
2b770 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b780 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
2b790 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
2b7a0 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
2b7b0 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
2b7c0 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
2b7d0 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2b7e0 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
2b7f0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
2b800 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
2b810 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2b820 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
2b830 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2b840 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
2b850 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
2b860 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
2b870 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
2b880 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2b890 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
2b8a0 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2b8b0 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2b8c0 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2b8d0 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2b8e0 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2b8f0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2b900 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2b910 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2b920 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2b930 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2b940 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2b950 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
2b960 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
2b970 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
2b980 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
2b990 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
2b9a0 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
2b9b0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2b9c0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
2b9d0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
2b9e0 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2b9f0 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
2ba00 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2ba10 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2ba20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2ba30 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
2ba40 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
2ba50 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
2ba60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ba70 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
2ba80 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
2ba90 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
2baa0 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
2bab0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
2bac0 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2bad0 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2bae0 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2baf0 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2bb00 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2bb10 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2bb20 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2bb30 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2bb40 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2bb50 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2bb60 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2bb70 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2bb80 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2bb90 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2bba0 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2bbb0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2bbc0 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2bbd0 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2bbe0 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2bbf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bc00 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2bc10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2bc20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2bc30 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2bc40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2bc50 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2bc60 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2bc70 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2bc80 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2bc90 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2bca0 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2bcb0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2bcc0 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2bcd0 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2bce0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2bcf0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2bd00 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2bd10 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2bd20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
2bd30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2bd40 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
2bd50 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2bd60 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
2bd70 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2bd80 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
2bd90 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
2bda0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bdb0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
2bdc0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
2bdd0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2bde0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
2bdf0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2be00 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
2be10 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
2be20 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
2be30 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2be40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2be50 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2be60 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2be70 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2be80 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2be90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bea0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2beb0 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2bec0 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
2bed0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
2bee0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2bef0 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2bf00 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2bf10 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2bf20 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2bf30 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2bf40 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2bf50 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2bf60 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2bf70 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2bf80 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2bf90 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
2bfa0 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
2bfb0 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
2bfc0 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
2bfd0 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
2bfe0 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
2bff0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
2c000 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
2c010 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
2c020 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2c030 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2c040 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2c050 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2c060 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2c070 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2c080 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2c090 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2c0a0 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2c0b0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
2c0c0 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2c0d0 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2c0e0 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
2c0f0 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
2c100 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2c110 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
2c120 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
2c130 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
2c140 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2c150 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
2c160 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2c170 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2c180 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2c190 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2c1a0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2c1b0 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2c1c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
2c1d0 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
2c1e0 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
2c1f0 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
2c200 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
2c210 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
2c220 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2c230 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
2c240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c280 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2c2b0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2d0 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
2c2e0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
2c2f0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2c300 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
2c310 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
2c320 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
2c330 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2c340 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2c350 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2c360 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
2c370 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
2c380 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
2c390 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
2c3a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2c3b0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2c3c0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2c3d0 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
2c3e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2c3f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2c400 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
2c410 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79  ened */.  int sy
2c420 6e 63 44 69 72 2c 20 20 20 20 20 20 20 20 20 20  ncDir,          
2c430 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 79 6e    /* True to syn
2c440 63 20 64 69 72 65 63 74 6f 72 79 20 6f 6e 20 66  c directory on f
2c450 69 72 73 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73  irst sync */.  s
2c460 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
2c470 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
2c480 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
2c490 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2c4a0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c4b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
2c4c0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
2c4d0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2c4e0 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20    int noLock,   
2c4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69            /* Omi
2c500 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75  t locking if tru
2c510 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c  e */.  int isDel
2c520 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
2c530 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
2c540 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  e if true */.  i
2c550 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 20 20  nt isReadOnly   
2c560 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c570 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70  f the file is op
2c580 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  ened read-only *
2c590 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
2c5a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c5b0 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
2c5c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2c5d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2c5e0 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
2c5f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2c600 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  ert( pNew->pInod
2c610 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  e==NULL );..  /*
2c620 20 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c   Parameter isDel
2c630 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ete is only used
2c640 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70   on vxworks. Exp
2c650 72 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63  ress this explic
2c660 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20  itly .  ** here 
2c670 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69  to prevent compi
2c680 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ler warnings abo
2c690 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
2c6a0 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55  ters..  */.  UNU
2c6b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
2c6c0 44 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55  Delete);..  /* U
2c6d0 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
2c6e0 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
2c6f0 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
2c700 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
2c710 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
2c720 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
2c730 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
2c740 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
2c750 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
2c760 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
2c770 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
2c780 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
2c790 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2c7a0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2c7b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2c7c0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2c7d0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
2c7e0 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
2c7f0 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
2c800 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
2c810 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
2c820 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
2c830 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2c840 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2c850 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ' );.#endif..  /
2c860 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63  * No locking occ
2c870 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  urs in temporary
2c880 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65   files */.  asse
2c890 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2c8a0 20 7c 7c 20 6e 6f 4c 6f 63 6b 20 29 3b 0a 0a 20   || noLock );.. 
2c8b0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2c8c0 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2c8d0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2c8e0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2c8f0 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2c900 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2c910 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2c920 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2c930 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
2c940 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2c950 46 69 6c 65 6e 61 6d 65 2c 20 22 70 73 6f 77 22  Filename, "psow"
2c960 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
2c970 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
2c980 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2c990 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2c9a0 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  _PSOW;.  }.  if(
2c9b0 20 6d 65 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e   memcmp(pVfs->zN
2c9c0 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c  ame,"unix-excl",
2c9d0 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  10)==0 ){.    pN
2c9e0 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2c9f0 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a   UNIXFILE_EXCL;.
2ca00 20 20 7d 0a 20 20 69 66 28 20 69 73 52 65 61 64    }.  if( isRead
2ca10 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 4e 65 77  Only ){.    pNew
2ca20 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2ca30 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  NIXFILE_RDONLY;.
2ca40 20 20 7d 0a 20 20 69 66 28 20 73 79 6e 63 44 69    }.  if( syncDi
2ca50 72 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  r ){.    pNew->c
2ca60 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2ca70 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
2ca80 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2ca90 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
2caa0 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
2cab0 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
2cac0 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
2cad0 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d   ){.    noLock =
2cae0 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
2caf0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
2cb00 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c  endif..  if( noL
2cb10 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2cb20 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f  ingStyle = &nolo
2cb30 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2cb40 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  else{.    pLocki
2cb50 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69  ngStyle = (**(fi
2cb60 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d  nder_type*)pVfs-
2cb70 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65  >pAppData)(zFile
2cb80 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66  name, pNew);.#if
2cb90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2cba0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2cbb0 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e   /* Cache zFilen
2cbc0 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ame in the locki
2cbd0 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20  ng context (AFP 
2cbe0 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72  and dotlock over
2cbf0 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a  ride) for.    **
2cc00 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76   proxyLock activ
2cc10 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
2cc20 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20  e (remote proxy 
2cc30 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e  is based on db n
2cc40 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c  ame).    ** zFil
2cc50 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61  ename remains va
2cc60 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69  lid until file i
2cc70 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70  s closed, to sup
2cc80 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77  port */.    pNew
2cc90 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2cca0 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e   = (void*)zFilen
2ccb0 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ame;.#endif.  }.
2ccc0 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  .  if( pLockingS
2ccd0 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f  tyle == &posixIo
2cce0 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69  Methods.#if defi
2ccf0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2cd00 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2cd10 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2cd20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79    || pLockingSty
2cd30 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68  le == &nfsIoMeth
2cd40 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ods.#endif.  ){.
2cd50 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2cd60 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2cd70 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2cd80 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2cd90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2cda0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cdb0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2cdc0 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64   occured in find
2cdd0 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
2cde0 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2cdf0 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
2ce00 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
2ce10 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
2ce20 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
2ce30 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
2ce40 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
2ce50 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
2ce60 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
2ce70 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
2ce80 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
2ce90 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
2cea0 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
2ceb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2cec0 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
2ced0 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
2cee0 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
2cef0 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
2cf00 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
2cf10 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
2cf20 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
2cf30 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
2cf40 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
2cf50 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
2cf60 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
2cf70 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
2cf80 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
2cf90 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
2cfa0 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
2cfb0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
2cfc0 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
2cfd0 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
2cfe0 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
2cff0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2d000 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
2d010 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
2d020 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
2d030 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
2d040 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2d050 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
2d060 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
2d070 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
2d080 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
2d090 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
2d0a0 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
2d0b0 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
2d0c0 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
2d0d0 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
2d0e0 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
2d0f0 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
2d100 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
2d110 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
2d120 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2d130 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2d140 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2d150 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
2d160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
2d170 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2d180 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2d190 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d1a0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2d1b0 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
2d1c0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2d1d0 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
2d1e0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
2d1f0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2d200 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2d210 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2d220 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2d230 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
2d240 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
2d250 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
2d260 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
2d270 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2d280 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
2d290 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
2d2a0 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
2d2b0 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
2d2c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2d2d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2d2e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
2d2f0 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
2d300 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
2d310 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
2d320 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
2d330 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
2d340 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
2d350 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
2d360 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
2d370 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
2d380 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
2d390 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
2d3a0 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
2d3b0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
2d3c0 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
2d3d0 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
2d3e0 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
2d3f0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d400 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2d410 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2d420 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2d430 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2d460 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2d470 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
2d480 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2d490 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2d4a0 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2d4b0 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
2d4c0 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
2d4d0 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
2d4e0 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
2d4f0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d500 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
2d510 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
2d520 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
2d530 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2d540 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2d550 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2d560 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
2d570 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
2d580 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
2d590 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
2d5a0 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
2d5b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69  .    assert( zFi
2d5c0 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  lename!=0 );.   
2d5d0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
2d5e0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
2d5f0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
2d600 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
2d610 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2d620 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
2d630 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
2d640 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2d650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2d670 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2d680 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
2d690 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
2d6a0 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
2d6b0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2d6c0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2d6d0 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
2d6e0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
2d6f0 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
2d700 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2d710 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
2d720 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
2d730 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
2d740 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2d750 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2d760 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
2d770 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
2d780 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
2d790 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
2d7a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2d7b0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2d7c0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2d7d0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
2d7e0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
2d7f0 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
2d800 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
2d810 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2d820 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
2d830 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2d840 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
2d850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2d860 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
2d870 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
2d880 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
2d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8a0 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
2d8b0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
2d8c0 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
2d8d0 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
2d8e0 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
2d8f0 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
2d900 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
2d910 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
2d920 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
2d930 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
2d940 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
2d950 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2d960 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2d970 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
2d980 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2d990 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2d9a0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2d9b0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
2d9c0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
2d9d0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2d9e0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
2d9f0 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
2da00 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
2da10 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2da20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2da30 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2da40 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2da50 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2da60 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2da70 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2da80 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
2da90 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
2daa0 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
2dab0 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
2dac0 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2dad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2dae0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2daf0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2db00 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2db10 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2db20 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2db30 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2db40 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
2db50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2db60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2db70 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
2db80 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
2db90 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
2dba0 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
2dbb0 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
2dbc0 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
2dbd0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
2dbe0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
2dbf0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2dc00 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
2dc10 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2dc20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
2dc30 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
2dc40 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
2dc50 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
2dc60 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
2dc70 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
2dc80 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
2dc90 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
2dca0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2dcb0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2dcc0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
2dcd0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
2dce0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
2dcf0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2dd00 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
2dd10 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2dd20 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
2dd30 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
2dd40 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
2dd50 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2dd60 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
2dd70 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
2dd80 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
2dd90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
2dda0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
2ddb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ddc0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
2ddd0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
2dde0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2ddf0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
2de00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2de10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2de20 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
2de30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2de40 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2de50 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2de60 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2de70 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2de80 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2de90 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2dea0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2deb0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2dec0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2ded0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2dee0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2def0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2df00 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
2df10 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2df20 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
2df30 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
2df40 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
2df50 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
2df60 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
2df70 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
2df80 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2df90 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
2dfa0 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
2dfb0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2dfc0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2dfd0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2dfe0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2dff0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2e000 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2e010 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2e020 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2e030 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2e040 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
2e050 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
2e060 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2e070 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
2e080 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
2e090 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
2e0a0 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
2e0b0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
2e0c0 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
2e0d0 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
2e0e0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
2e0f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2e100 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
2e110 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
2e120 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
2e130 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
2e140 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
2e150 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
2e160 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
2e170 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
2e180 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2e190 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2e1a0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
2e1b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
2e1c0 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
2e1d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2e1e0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
2e1f0 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
2e200 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
2e210 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2e220 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
2e230 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2e240 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
2e250 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
2e260 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
2e270 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
2e280 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
2e290 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
2e2a0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
2e2b0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
2e2c0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
2e2d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2e2e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
2e2f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e300 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2e310 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2e320 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
2e330 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
2e340 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
2e350 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
2e360 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
2e370 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
2e380 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
2e390 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
2e3a0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
2e3b0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2e3c0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
2e3d0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2e3e0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
2e3f0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
2e400 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
2e410 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
2e420 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
2e430 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2e440 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
2e450 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
2e460 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
2e470 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
2e480 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
2e490 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
2e4a0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
2e4b0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
2e4c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
2e4d0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
2e4e0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
2e4f0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
2e500 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2e510 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
2e520 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
2e530 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
2e540 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2e550 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
2e560 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
2e570 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
2e580 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
2e590 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
2e5a0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
2e5b0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
2e5c0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
2e5d0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
2e5e0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
2e5f0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
2e600 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
2e610 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
2e620 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
2e630 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
2e640 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
2e650 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
2e660 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2e670 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
2e680 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
2e690 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
2e6a0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
2e6b0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
2e6c0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
2e6d0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
2e6e0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
2e6f0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
2e700 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
2e710 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
2e720 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
2e730 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
2e740 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
2e750 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
2e760 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
2e770 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2e780 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
2e790 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
2e7a0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2e7b0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
2e7c0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
2e7d0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
2e7e0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
2e7f0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
2e800 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
2e810 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
2e820 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
2e830 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
2e840 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
2e850 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
2e860 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
2e870 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
2e880 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
2e890 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
2e8a0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
2e8b0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
2e8c0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
2e8d0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
2e8e0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2e8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2e900 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
2e910 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
2e920 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
2e930 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
2e940 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
2e950 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
2e960 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
2e970 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
2e980 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
2e990 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
2e9a0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
2e9b0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
2e9c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2e9d0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
2e9e0 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
2e9f0 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
2ea00 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2ea10 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2ea20 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
2ea30 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
2ea40 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
2ea50 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
2ea60 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
2ea70 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
2ea80 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
2ea90 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
2eaa0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
2eab0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
2eac0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
2ead0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
2eae0 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
2eaf0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2eb00 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
2eb10 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
2eb20 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
2eb30 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
2eb40 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
2eb50 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2eb60 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
2eb70 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
2eb80 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
2eb90 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
2eba0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
2ebb0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
2ebc0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
2ebd0 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
2ebe0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
2ebf0 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
2ec00 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
2ec10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2ec20 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
2ec30 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
2ec40 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
2ec50 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
2ec60 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
2ec70 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
2ec80 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
2ec90 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2eca0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
2ecb0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2ecc0 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
2ecd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2ece0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2ecf0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2ed00 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
2ed10 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
2ed20 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
2ed30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2ed40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2ed50 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
2ed60 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2ed70 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
2ed80 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
2ed90 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
2eda0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2edb0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2edc0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
2edd0 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
2ede0 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
2edf0 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
2ee00 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
2ee10 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
2ee20 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
2ee30 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2ee40 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
2ee50 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
2ee60 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2ee70 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
2ee80 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
2ee90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2eea0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2eeb0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2eec0 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61  file, it is alwa
2eed0 79 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a  ys created with.
2eee0 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72  ** the octal per
2eef0 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72  missions 0600 (r
2ef00 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20  ead/writable by 
2ef10 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20  owner only). If 
2ef20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
2ef30 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73   database or mas
2ef40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2ef50 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
2ef60 77 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73  with the permiss
2ef70 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51  ions .** mask SQ
2ef80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2ef90 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a  E_PERMISSIONS..*
2efa0 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  *.** Finally, if
2efb0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2efc0 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2efd0 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2efe0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2eff0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2f000 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2f010 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2f020 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2f030 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2f040 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2f050 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2f060 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2f070 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2f080 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2f090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2f0a0 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2f0b0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2f0c0 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2f0d0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2f0e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2f0f0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2f100 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2f110 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2f120 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2f130 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2f140 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2f150 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2f160 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2f170 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2f180 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2f190 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2f1a0 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2f1b0 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2f1c0 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2f1d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2f1e0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2f1f0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2f200 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2f210 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2f220 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2f230 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2f240 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f260 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2f270 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2f280 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2f290 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2f2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f2b0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2f2c0 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2f2d0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2f2e0 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f300 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2f310 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2f320 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f340 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2f350 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2f360 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2f370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2f380 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f390 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2f3a0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
2f3b0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2f3c0 53 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c 61  SIONS;.  if( fla
2f3d0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
2f3e0 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
2f3f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
2f400 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
2f410 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
2f420 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2f430 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2f440 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2f470 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
2f480 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
2f490 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2f4a0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
2f4b0 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
2f4c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2f4d0 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2f4e0 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2f4f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2f500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2f510 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2f520 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2f530 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2f540 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2f550 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2f560 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2f570 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2f580 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2f590 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2f5a0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2f5b0 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2f5c0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2f5d0 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2f5e0 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2f5f0 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2f600 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2f610 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2f620 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2f630 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
2f640 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
2f650 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
2f660 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
2f670 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
2f680 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
2f690 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
2f6a0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
2f6b0 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
2f6c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2f6d0 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
2f6e0 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74 65   nDb>0 && sqlite
2f6f0 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e  3Isalnum(zPath[n
2f700 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  Db]) ) nDb--;.  
2f710 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
2f720 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2f730 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2f740 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68  OK;.#else.    wh
2f750 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ile( zPath[nDb]!
2f760 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61 73  ='-' ){.      as
2f770 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20  sert( nDb>0 );. 
2f780 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 61       assert( zPa
2f790 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b  th[nDb]!='\n' );
2f7a0 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
2f7b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d    }.#endif.    m
2f7c0 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68  emcpy(zDb, zPath
2f7d0 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b  , nDb);.    zDb[
2f7e0 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  nDb] = '\0';..  
2f7f0 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2f800 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  zDb, &sStat) ){.
2f810 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73        *pMode = s
2f820 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
2f830 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69 64  777;.      *pUid
2f840 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b   = sStat.st_uid;
2f850 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20 73  .      *pGid = s
2f860 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20  Stat.st_gid;.   
2f870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2f880 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2f890 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
2f8a0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
2f8b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2f8c0 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
2f8d0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
2f8e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2f900 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
2f910 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
2f920 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
2f930 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
2f940 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
2f950 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
2f960 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
2f970 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2f980 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
2f990 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2f9a0 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
2f9b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2f9c0 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
2f9d0 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
2f9e0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
2f9f0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
2fa00 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
2fa10 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
2fa20 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
2fa30 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
2fa40 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
2fa50 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
2fa60 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
2fa70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
2fa80 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2fa90 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
2faa0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
2fab0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2fac0 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
2fad0 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
2fae0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
2faf0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
2fb00 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2fb10 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
2fb20 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
2fb30 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
2fb40 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
2fb50 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
2fb60 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
2fb70 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
2fb80 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
2fb90 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
2fba0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
2fbb0 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
2fbc0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
2fbd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2fbe0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
2fbf0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2fc00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
2fc10 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
2fc20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
2fc30 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
2fc40 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2fc50 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
2fc60 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2fc70 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2fc80 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2fc90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2fca0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2fcb0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
2fcc0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fce0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
2fcf0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
2fd00 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
2fd10 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
2fd20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2fd30 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
2fd40 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
2fd50 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
2fd60 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
2fd70 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
2fd80 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
2fd90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2fda0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
2fdb0 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
2fdc0 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
2fdd0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2fde0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
2fdf0 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
2fe00 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
2fe10 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
2fe20 43 54 49 4f 4e 0a 20 20 69 6e 74 20 65 54 79 70  CTION.  int eTyp
2fe30 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 30 46  e = flags&0xFF0F
2fe40 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
2fe50 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
2fe60 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 65 54  /.#else.  int eT
2fe70 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
2fe80 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
2fe90 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
2fea0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
2feb0 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
2fec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fed0 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
2fee0 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
2fef0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2ff00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2ff10 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
2ff20 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20  eturn Code */.. 
2ff30 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
2ff40 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2ff50 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2ff60 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
2ff70 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
2ff80 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2ff90 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
2ffa0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
2ffb0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2ffc0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2ffd0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
2ffe0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
2fff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
30000 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
30010 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
30020 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
30030 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
30040 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30050 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
30060 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
30070 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
30080 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
30090 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
300a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
300b0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
300c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
300d0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
300e0 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
300f0 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
30100 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
30110 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
30120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
30130 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
30140 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
30150 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
30160 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
30170 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
30180 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
30190 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
301a0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
301b0 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
301c0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
301d0 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d  .  int syncDir =
301e0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
301f0 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
30200 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
30210 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
30220 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
30230 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
30240 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
30250 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
30260 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
30270 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
30280 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
30290 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
302a0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
302b0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
302c0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
302d0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
302e0 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
302f0 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
30300 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
30310 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
30320 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
30330 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
30340 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
30350 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
30360 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
30370 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
30380 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
30390 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
303a0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
303b0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
303c0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
303d0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
303e0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
303f0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
30400 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
30410 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
30420 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
30430 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
30440 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
30450 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
30460 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
30470 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
30480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
30490 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
304a0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
304b0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
304c0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
304d0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
304e0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
304f0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
30500 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
30510 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
30520 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
30530 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
30540 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
30550 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
30560 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
30570 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
30580 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
30590 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
305a0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
305b0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
305c0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
305d0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
305e0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
305f0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
30600 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
30610 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
30620 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
30630 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
30640 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
30650 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
30660 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
30670 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
30680 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
30690 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
306a0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
306b0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
306c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
306d0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
306e0 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
306f0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
30700 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
30710 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
30720 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
30730 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
30740 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
30750 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
30760 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
30770 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30780 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
30790 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
307a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
307b0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
307c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
307d0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
307e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
307f0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
30800 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
30810 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
30820 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
30830 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30840 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
30850 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
30860 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
30870 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
30880 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
30890 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
308a0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
308b0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
308c0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
308d0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
308e0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
308f0 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
30900 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
30910 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
30920 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
30930 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
30940 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
30950 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
30960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30970 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
30980 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
30990 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
309a0 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
309b0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
309c0 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
309d0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
309e0 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
309f0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
30a00 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
30a10 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20  && !syncDir);.  
30a20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65    rc = unixGetTe
30a30 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e  mpname(MAX_PATHN
30a40 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29  AME+1, zTmpname)
30a50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30a80 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
30a90 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
30aa0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
30ab0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61  value of the fla
30ac0 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  gs parameter pas
30ad0 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e  sed to POSIX fun
30ae0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28  ction.  ** open(
30af0 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65  ). These must be
30b00 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e   calculated even
30b10 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f   if open() is no
30b20 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a  t called, as.  *
30b30 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74  * they may be st
30b40 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
30b50 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
30b60 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
30b70 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c  .  ** 'conch fil
30b80 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74  e' locking funct
30b90 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20  ions later on.  
30ba0 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  */.  if( isReado
30bb0 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73  nly )  openFlags
30bc0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
30bd0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
30be0 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f  ) openFlags |= O
30bf0 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43  _RDWR;.  if( isC
30c00 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46  reate )    openF
30c10 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
30c20 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
30c30 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  ve ) openFlags |
30c40 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
30c50 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61  LLOW);.  openFla
30c60 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
30c70 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 23  LE|O_BINARY);..#
30c80 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
30c90 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
30ca0 0a 20 20 70 2d 3e 70 72 6f 74 46 6c 61 67 73 20  .  p->protFlags 
30cb0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
30cc0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
30cd0 43 54 49 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65 6e  CTION_MASK);.#en
30ce0 64 69 66 0a 20 20 20 20 0a 20 20 69 66 28 20 66  dif.    .  if( f
30cf0 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
30d00 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
30d10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
30d20 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
30d30 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
30d40 20 20 20 75 69 64 5f 74 20 75 69 64 3b 0a 20 20     uid_t uid;.  
30d50 20 20 67 69 64 5f 74 20 67 69 64 3b 0a 20 20 20    gid_t gid;.   
30d60 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
30d70 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
30d80 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
30d90 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20  , &uid, &gid);. 
30da0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
30dc0 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65  sert( !p->pUnuse
30dd0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
30de0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
30df0 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79  _OPEN_WAL || eTy
30e00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30e10 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
30e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30e30 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20  .    }.    fd = 
30e40 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
30e50 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
30e60 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
30e70 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25  RACE(("OPENX   %
30e80 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
30e90 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
30ea0 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ags));.    if( f
30eb0 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
30ec0 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
30ed0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
30ee0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
30ef0 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
30f00 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
30f10 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
30f20 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
30f30 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20  .      flags &= 
30f40 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
30f50 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
30f60 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
30f70 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20     openFlags &= 
30f80 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  ~(O_RDWR|O_CREAT
30f90 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  );.      flags |
30fa0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
30fb0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70  ADONLY;.      op
30fc0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
30fd0 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61  NLY;.      isRea
30fe0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
30ff0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
31000 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
31010 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
31020 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
31030 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
31040 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
31050 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
31060 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65  T, "open", zName
31070 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
31080 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
31090 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 27   }.    /* if we'
310a0 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 77  re opening the w
310b0 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  al or journal an
310c0 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  d running as roo
310d0 74 2c 20 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  t, set the journ
310e0 61 6c 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20  al uid/gid */.  
310f0 20 20 69 66 28 20 21 69 73 52 65 61 64 6f 6e 6c    if( !isReadonl
31100 79 20 26 26 20 28 66 6c 61 67 73 20 26 20 28 53  y && (flags & (S
31110 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
31120 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31130 4a 4f 55 52 4e 41 4c 29 29 20 29 7b 0a 20 20 20  JOURNAL)) ){.   
31140 20 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20     uid_t euid = 
31150 67 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20 20  geteuid();.     
31160 20 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20   if( euid==0 && 
31170 28 65 75 69 64 21 3d 75 69 64 20 7c 7c 20 67 65  (euid!=uid || ge
31180 74 65 67 69 64 28 29 21 3d 67 69 64 29 20 29 7b  tegid()!=gid) ){
31190 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63 68  .        if( fch
311a0 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64  own(fd, uid, gid
311b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
311c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
311d0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
311e0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
311f0 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20  nished;.        
31200 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31210 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
31220 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
31230 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
31240 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
31250 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
31260 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
31270 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
31280 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
31290 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
312a0 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
312b0 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
312c0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
312d0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
312e0 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  e.    osUnlink(z
312f0 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
31300 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
31310 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
31320 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
31330 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
31340 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
31350 69 66 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c  if..#ifdef FD_CL
31360 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c 28  OEXEC.  osFcntl(
31370 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
31380 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
31390 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
313a0 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f  C);.#endif..  no
313b0 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51  Lock = eType!=SQ
313c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
313d0 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  B;..  .#if defin
313e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
313f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
31400 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
31410 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
31420 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
31430 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
31440 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72  )pFile)->lastErr
31450 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
31460 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
31470 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
31480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31490 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
314a0 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
314b0 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
314c0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
314d0 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
314e0 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
314f0 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
31500 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
31510 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  SDOS;.  }.  if (
31520 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78  0 == strncmp("ex
31530 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  fat", fsInfo.f_f
31540 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
31550 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
31560 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
31570 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
31580 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
31590 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 53  .#endif.  .#if S
315a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
315b0 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53  KING_STYLE.#if S
315c0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
315d0 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41  XY_LOCKING.  isA
315e0 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65  utoProxy = 1;.#e
315f0 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74  ndif.  if( isAut
31600 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68  oProxy && (zPath
31610 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c  !=NULL) && (!noL
31620 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f  ock) && pVfs->xO
31630 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  pen ){.    char 
31640 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65  *envforce = gete
31650 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45  nv("SQLITE_FORCE
31660 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29  _PROXY_LOCKING")
31670 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f  ;.    int usePro
31680 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  xy = 0;..    /* 
31690 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
316a0 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65  XY_LOCKING==1 me
316b0 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73  ans force always
316c0 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65   use proxy, 0 me
316d0 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65  ans .    ** neve
316e0 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c  r use proxy, NUL
316f0 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78  L means use prox
31700 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  y for non-local 
31710 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a  files only.  */.
31720 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65      if( envforce
31730 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
31740 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28  useProxy = atoi(
31750 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20  envforce)>0;.   
31760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
31770 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20  ( statfs(zPath, 
31780 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
31790 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20  {.        /* In 
317a0 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73  theory, the clos
317b0 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75  e(fd) call is su
317c0 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68  b-optimal. If th
317d0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20  e file opened.  
317e0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64        ** with fd
317f0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
31800 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
31810 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  re other connect
31820 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ions open.      
31830 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c    ** on that fil
31840 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
31850 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76  ntly holding adv
31860 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69  isory locks on i
31870 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t,.        ** th
31880 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  en the call to c
31890 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63  lose() will canc
318a0 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  el those locks. 
318b0 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20  In practice,.   
318c0 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73       ** we're as
318d0 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74  suming that stat
318e0 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69  fs() doesn't fai
318f0 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74  l very often. At
31900 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a   least.        *
31910 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65  * not while othe
31920 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
31930 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  rs opened by the
31940 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e   same process on
31950 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
31960 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f  same file are wo
31970 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20  rking.  */.     
31980 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20     p->lastErrno 
31990 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
319a0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
319b0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
319c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
319d0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
319e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f  ;.        goto o
319f0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
31a00 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50      }.      useP
31a10 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e  roxy = !(fsInfo.
31a20 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41  f_flags&MNT_LOCA
31a30 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
31a40 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20  ( useProxy ){.  
31a50 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55      rc = fillInU
31a60 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
31a70 2c 20 73 79 6e 63 44 69 72 2c 20 70 46 69 6c 65  , syncDir, pFile
31a80 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
31a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31aa0 20 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c             isDel
31ab0 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29  ete, isReadonly)
31ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
31ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31ae0 20 20 20 20 20 2f 2a 20 63 61 63 68 65 20 74 68       /* cache th
31af0 65 20 70 4d 65 74 68 6f 64 20 69 6e 20 63 61 73  e pMethod in cas
31b00 65 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 20  e the transform 
31b10 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20  fails */.       
31b20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
31b30 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
31b40 20 2a 70 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c   *pMethod = pFil
31b50 65 2d 3e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  e->pMethods;.   
31b60 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
31b70 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
31b80 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
31b90 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
31ba0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31bc0 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
31bd0 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
31be0 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
31bf0 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
31c00 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
31c10 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
31c20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
31c30 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
31c40 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
31c50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
31c60 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
31c70 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
31c80 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
31c90 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
31ca0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31cb0 20 20 20 20 69 66 28 20 70 4d 65 74 68 6f 64 21      if( pMethod!
31cc0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
31cd0 20 20 20 20 20 70 4d 65 74 68 6f 64 2d 3e 78 43       pMethod->xC
31ce0 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
31cf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31d00 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c            unixCl
31d10 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
31d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31d50 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
31d60 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
31d70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
31d80 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
31d90 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79 6e  le(pVfs, fd, syn
31da0 63 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50 61  cDir, pFile, zPa
31db0 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20  th, noLock,.    
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dd0 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65    isDelete, isRe
31de0 61 64 6f 6e 6c 79 29 3b 0a 6f 70 65 6e 5f 66 69  adonly);.open_fi
31df0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
31e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31e10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31e20 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d  p->pUnused);.  }
31e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31e40 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
31e50 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
31e60 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
31e70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
31e80 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
31e90 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
31ea0 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
31eb0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
31ec0 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
31ed0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
31ee0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
31ef0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
31f00 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
31f10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
31f20 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
31f30 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
31f40 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
31f50 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
31f60 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
31f70 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
31f80 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
31f90 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
31fa0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
31fb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31fc0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31fd0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31fe0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
31ff0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
32000 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
32010 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
32020 74 68 29 3d 3d 28 2d 31 29 20 26 26 20 65 72 72  th)==(-1) && err
32030 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
32040 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
32050 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
32060 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69  RR_DELETE, "unli
32070 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  nk", zPath);.  }
32080 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32090 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
320a0 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b    if( dirSync ){
320b0 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20  .    int fd;.   
320c0 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
320d0 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
320e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
320f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20  QLITE_OK ){.#if 
32100 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
32110 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d   if( fsync(fd)==
32120 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20  -1 ).#else.     
32130 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29   if( fsync(fd) )
32140 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
32150 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
32160 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
32170 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
32180 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68  , "fsync", zPath
32190 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 4f  );.      }.#if O
321a0 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
321b0 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69  SE_IOERR.      i
321c0 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72  f( close(fd)&&!r
321d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
321e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
321f0 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  IR_CLOSE;.      
32200 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 6f  }.#else.      ro
32210 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
32220 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e  , __LINE__);.#en
32230 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
32240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
32250 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
32260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32270 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
32280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32290 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
322a0 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
322b0 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
322c0 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
322d0 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
322e0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
322f0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
32300 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
32310 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32320 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
32330 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
32340 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
32350 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
32360 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
32370 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
32380 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
32390 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
323a0 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
323b0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
323c0 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
323d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
323e0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
323f0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
32400 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
32410 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
32420 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
32430 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
32440 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
32450 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
32460 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
32470 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
32480 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
32490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
324a0 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
324b0 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
324c0 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
324d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
324e0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
324f0 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
32500 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
32510 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30  .  int amode = 0
32520 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32530 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32540 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
32550 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
32560 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
32570 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
32580 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
32590 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
325a0 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  S:.      amode =
325b0 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   F_OK;.      bre
325c0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
325d0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
325e0 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64  RITE:.      amod
325f0 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20  e = W_OK|R_OK;. 
32600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32610 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
32620 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61  SS_READ:.      a
32630 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20  mode = R_OK;.   
32640 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
32650 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
32660 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
32670 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
32680 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
32690 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74  = (osAccess(zPat
326a0 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
326b0 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
326c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
326d0 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a   && *pResOut ){.
326e0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
326f0 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  buf;.    if( 0==
32700 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
32710 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
32720 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
32730 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
32740 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
32750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
32760 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
32770 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
32780 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
32790 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
327a0 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
327b0 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
327c0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
327d0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
327e0 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
327f0 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
32800 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
32810 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
32820 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
32830 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
32840 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
32850 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
32860 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
32870 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
32880 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
32890 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
328a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
328b0 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
328c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
328d0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
328e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
328f0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
32900 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
32910 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32920 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
32930 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
32940 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
32970 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
32980 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
32990 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
329a0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
329b0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
329c0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
329d0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
329e0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
329f0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
32a00 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
32a10 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
32a20 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
32a30 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
32a40 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
32a50 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
32a60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
32a70 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
32a80 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
32a90 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
32aa0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
32ab0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
32ac0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
32ad0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
32ae0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
32af0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
32b00 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
32b10 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
32b20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
32b30 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
32b40 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
32b50 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
32b60 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
32b70 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
32b80 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
32b90 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
32ba0 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
32bb0 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
32bc0 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
32bd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
32be0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
32bf0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
32c00 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
32c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
32c20 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
32c30 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
32c40 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
32c50 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
32c60 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
32c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
32c80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
32c90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32ca0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
32cb0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
32cc0 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
32cd0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
32ce0 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
32cf0 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
32d00 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
32d10 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
32d20 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
32d30 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
32d40 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
32d50 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
32d60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32d70 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
32d80 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
32d90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32da0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
32db0 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
32dc0 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
32dd0 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
32de0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
32df0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
32e00 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
32e10 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
32e20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
32e30 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
32e40 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
32e50 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
32e60 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
32e70 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
32e80 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
32e90 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
32ea0 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
32eb0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
32ec0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
32ed0 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
32ee0 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
32ef0 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
32f00 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
32f10 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
32f20 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
32f30 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
32f40 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
32f50 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
32f60 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
32f70 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
32f80 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32f90 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
32fa0 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
32fb0 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
32fc0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
32fd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
32fe0 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
32ff0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
33000 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
33010 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
33020 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
33030 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33040 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
33050 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
33060 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
33070 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
33080 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
33090 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
330a0 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
330b0 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
330c0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
330d0 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
330e0 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
330f0 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
33100 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
33110 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
33120 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
33130 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
33140 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
33150 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
33160 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
33170 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
33180 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
33190 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
331a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
331b0 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
331c0 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
331d0 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
331e0 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
331f0 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
33200 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
33210 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
33220 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
33230 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
33240 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
33250 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
33260 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
33270 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
33280 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
33290 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
332a0 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
332b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
332c0 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
332d0 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
332e0 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
332f0 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
33300 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
33310 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
33320 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
33330 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
33340 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
33350 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
33360 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
33370 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
33380 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
33390 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
333a0 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
333b0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
333c0 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
333d0 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
333e0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
333f0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33400 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
33410 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
33420 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
33430 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
33440 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
33450 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
33460 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
33470 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
33480 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
33490 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
334a0 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
334b0 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
334c0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
334d0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
334e0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
334f0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
33500 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
33510 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
33520 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
33530 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
33540 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
33550 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
33560 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
33570 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
33580 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
33590 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
335a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
335b0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
335c0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
335d0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
335e0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
335f0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33600 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
33610 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
33620 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
33630 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
33640 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
33650 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
33660 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
33670 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
33680 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
33690 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
336a0 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
336b0 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
336c0 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
336d0 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
336e0 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
336f0 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
33700 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
33710 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
33720 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
33730 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
33740 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
33750 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
33760 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
33770 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
33780 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
33790 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
337a0 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
337b0 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
337c0 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
337d0 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
337e0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
337f0 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
33800 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
33810 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
33820 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
33830 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
33840 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
33850 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
33860 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
33870 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
33880 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
33890 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
338a0 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
338b0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
338c0 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
338d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
338e0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
338f0 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 72  , fd;.    fd = r
33900 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
33910 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
33920 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
33930 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
33940 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
33950 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
33960 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
33970 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
33980 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
33990 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
339a0 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
339b0 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
339c0 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
339d0 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
339e0 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
339f0 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
33a00 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
33a10 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
33a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33a30 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65   do{ nBuf = osRe
33a40 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
33a50 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66  f); }while( nBuf
33a60 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
33a70 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
33a80 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
33a90 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
33aa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
33ab0 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
33ac0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
33ad0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
33ae0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
33af0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
33b00 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
33b10 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
33b20 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
33b30 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
33b40 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
33b50 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
33b60 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
33b70 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
33b80 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
33b90 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
33ba0 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
33bb0 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
33bc0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
33bd0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
33be0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
33bf0 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
33c00 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
33c10 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
33c20 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
33c30 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
33c40 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
33c50 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
33c60 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
33c70 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
33c80 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
33c90 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
33ca0 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
33cb0 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
33cc0 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
33cd0 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
33ce0 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
33cf0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
33d00 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33d10 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
33d20 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
33d30 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
33d40 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
33d50 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
33d60 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
33d70 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33d80 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
33d90 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
33da0 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
33db0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
33dc0 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
33dd0 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
33de0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
33df0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33e00 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
33e10 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
33e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
33e30 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
33e40 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
33e50 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
33e60 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
33e70 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
33e80 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
33e90 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
33ea0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
33eb0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
33ec0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
33ed0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
33ee0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
33ef0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
33f00 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
33f10 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
33f20 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
33f30 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
33f40 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
33f50 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
33f60 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
33f70 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
33f80 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
33f90 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
33fa0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
33fb0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
33fc0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
33fd0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
33fe0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
33ff0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
34000 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
34010 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
34020 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
34030 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
34040 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
34050 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
34060 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
34070 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
34080 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
34090 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
340a0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
340b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
340c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
340d0 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
340e0 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
340f0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
34100 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
34110 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
34120 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
34130 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
34140 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
34150 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
34160 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
34170 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
34180 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
34190 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63  640000;.  int rc
341a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69   = SQLITE_OK;.#i
341b0 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
341c0 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
341d0 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
341e0 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65  piNow = ((sqlite
341f0 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20  3_int64)t)*1000 
34200 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c  + unixEpoch;.#el
34210 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
34220 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
34230 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65  sNow;.  clock_ge
34240 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c  ttime(CLOCK_REAL
34250 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20  TIME, &sNow);.  
34260 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
34270 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
34280 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
34290 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  _sec + sNow.tv_n
342a0 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c  sec/1000000;.#el
342b0 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
342c0 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20  val sNow;.  if( 
342d0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
342e0 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ow, 0)==0 ){.   
342f0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
34300 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
34310 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
34320 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
34330 75 73 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c  usec/1000;.  }el
34340 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
34350 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
34360 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
34370 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
34380 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
34390 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
343a0 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
343b0 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
343c0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
343d0 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
343e0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
343f0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
34400 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34410 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
34420 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
34430 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
34440 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
34450 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
34460 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
34470 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
34480 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
34490 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
344a0 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
344b0 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
344c0 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
344d0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
344e0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
344f0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
34500 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
34510 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71  le *prNow){.  sq
34520 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
34530 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55  0;.  int rc;.  U
34540 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34550 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d  NotUsed);.  rc =
34560 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
34570 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
34580 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
34590 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
345a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  rc;.}../*.** We 
345b0 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
345c0 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
345d0 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
345e0 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
345f0 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
34600 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
34610 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
34620 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
34630 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
34640 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
34650 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
34660 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
34670 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
34680 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
34690 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
346a0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
346b0 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
346c0 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
346d0 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
346e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
346f0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
34700 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
34710 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
34720 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
34730 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
34740 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
34750 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
34760 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
34770 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
34780 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
34790 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
347a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
347b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
347c0 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
347d0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
347e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
347f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
34800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34840 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
34850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34890 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
348a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
348b0 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
348c0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
348d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
348e0 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
348f0 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
34900 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
34910 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
34920 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
34930 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
34940 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
34950 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
34960 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
34970 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
34980 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
34990 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
349a0 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
349b0 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
349c0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
349d0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
349e0 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
349f0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
34a00 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
34a10 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
34a20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
34a30 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
34a40 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
34a50 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
34a60 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
34a70 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
34a80 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
34a90 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
34aa0 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
34ab0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
34ac0 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
34ad0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
34ae0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
34af0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
34b00 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
34b10 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
34b20 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
34b30 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
34b40 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
34b50 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
34b60 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
34b70 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
34b80 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
34b90 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
34ba0 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
34bb0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
34bc0 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
34bd0 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
34be0 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
34bf0 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
34c00 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
34c10 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
34c20 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
34c30 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
34c40 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
34c50 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
34c60 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
34c70 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
34c80 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
34c90 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
34ca0 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
34cb0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
34cc0 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
34cd0 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
34ce0 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
34cf0 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
34d00 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
34d10 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
34d20 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
34d30 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
34d40 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
34d50 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
34d60 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
34d70 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
34d80 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
34d90 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
34da0 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
34db0 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
34dc0 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20     0x40000000.. 
34dd0 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45    ..**      RESE
34de0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
34df0 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
34e00 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
34e10 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
34e20 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
34e30 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
34e40 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
34e50 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
34e60 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
34e70 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
34e80 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
34e90 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
34ea0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
34eb0 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
34ec0 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
34ed0 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
34ee0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
34ef0 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
34f00 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
34f10 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
34f20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
34f30 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
34f40 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
34f50 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
34f60 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
34f70 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
34f80 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
34f90 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
34fa0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
34fb0 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
34fc0 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
34fd0 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
34fe0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
34ff0 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
35000 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
35010 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
35020 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
35030 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
35040 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
35050 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
35060 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
35070 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
35080 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
35090 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
350a0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
350b0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
350c0 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
350d0 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
350e0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
350f0 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
35100 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
35110 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
35120 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
35130 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
35140 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
35150 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
35160 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
35170 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
35180 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
35190 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
351a0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
351b0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
351c0 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
351d0 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
351e0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
351f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
35200 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
35210 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
35220 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
35230 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
35240 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
35250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35260 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
35270 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
35280 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
35290 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
352a0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
352b0 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
352c0 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
352d0 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
352e0 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
352f0 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
35300 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
35310 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
35320 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
35330 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
35340 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
35350 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
35360 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
35370 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
35380 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
35390 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
353a0 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
353b0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
353c0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
353d0 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
353e0 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
353f0 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
35400 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
35410 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
35420 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
35430 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
35440 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
35450 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
35460 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
35470 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
35480 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
35490 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
354a0 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
354b0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
354c0 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
354d0 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
354e0 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
354f0 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
35500 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
35510 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
35520 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
35530 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
35540 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
35550 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
35560 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
35570 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
35580 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
35590 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
355a0 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
355b0 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
355c0 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
355d0 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
355e0 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
355f0 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
35600 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
35610 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
35620 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
35630 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
35640 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
35650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35660 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
35670 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
35680 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
35690 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
356a0 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
356b0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
356c0 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
356d0 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
356e0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
356f0 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
35700 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
35710 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
35720 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
35730 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
35740 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
35750 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
35760 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
35770 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
35780 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
35790 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
357a0 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
357b0 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
357c0 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
357d0 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
357e0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
357f0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
35800 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
35810 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
35820 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
35830 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
35840 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
35850 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
35860 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
35870 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
35880 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
35890 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
358a0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
358b0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
358c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
358d0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
358e0 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
358f0 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
35900 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
35910 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
35920 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
35930 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
35940 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
35950 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
35960 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
35970 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
35980 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
35990 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
359a0 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
359b0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
359c0 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
359d0 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
359e0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
359f0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
35a00 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
35a10 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
35a20 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
35a30 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
35a40 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
35a50 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
35a60 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
35a70 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
35a80 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
35a90 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
35aa0 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
35ab0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
35ac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
35ad0 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
35ae0 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
35af0 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
35b00 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
35b10 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
35b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35b30 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
35b40 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
35b50 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
35b60 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
35b70 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
35b80 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
35b90 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
35ba0 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
35bb0 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
35bc0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
35bd0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
35be0 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
35bf0 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
35c00 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
35c10 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
35c20 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
35c30 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
35c40 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
35c50 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
35c60 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
35c70 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
35c80 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
35c90 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
35ca0 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
35cb0 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
35cc0 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
35cd0 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
35ce0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
35cf0 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
35d00 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
35d10 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
35d20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35d30 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
35d40 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
35d50 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
35d60 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
35d70 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
35d80 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
35d90 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
35da0 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
35db0 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
35dc0 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
35dd0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
35de0 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
35df0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
35e00 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
35e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e20 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
35e30 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
35e40 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
35e50 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
35e60 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
35e70 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
35e80 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
35e90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
35ea0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
35eb0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
35ec0 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
35ed0 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
35ee0 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
35ef0 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
35f00 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
35f10 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
35f20 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
35f30 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
35f40 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
35f50 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
35f60 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
35f70 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
35f80 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
35f90 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
35fa0 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
35fb0 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
35fc0 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
35fd0 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
35fe0 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
35ff0 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
36000 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
36010 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
36020 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
36030 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
36040 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
36050 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
36060 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
36070 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
36080 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
36090 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
360a0 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
360b0 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
360c0 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
360d0 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
360e0 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
360f0 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
36100 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
36110 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
36120 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
36130 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
36140 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
36150 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
36160 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
36170 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
36180 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
36190 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
361a0 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
361b0 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
361c0 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
361d0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
361e0 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
361f0 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
36200 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
36210 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
36220 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
36230 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
36240 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
36250 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
36260 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
36270 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
36280 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
36290 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
362a0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
362b0 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
362c0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
362d0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
362e0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
362f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
36300 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
36310 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
36320 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
36330 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36340 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
36350 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
36360 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
36370 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
36380 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
36390 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
363a0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
363b0 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
363c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
363d0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
363e0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
363f0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
36400 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
36410 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
36420 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
36430 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
36440 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
36450 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
36460 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
36470 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
36480 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
36490 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
364a0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
364b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
364c0 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
364d0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
364e0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
364f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
36500 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
36510 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
36520 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
36530 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
36540 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
36550 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
36560 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20    int nFails;   
36570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36580 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63  * Number of conc
36590 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65  h taking failure
365a0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
365b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
365c0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
365d0 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
365e0 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
365f0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
36600 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
36610 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
36620 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
36630 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
36640 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
36650 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
36660 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
36670 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
36680 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
36690 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
366a0 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
366b0 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
366c0 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
366d0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
366e0 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
366f0 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
36700 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
36710 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
36720 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
36730 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
36740 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
36750 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
36760 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
36770 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
36780 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
36790 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
367a0 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
367b0 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
367c0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
367d0 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
367e0 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
367f0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
36800 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
36810 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
36820 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
36830 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
36840 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
36850 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
36860 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
36870 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
36880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36890 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
368a0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
368b0 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
368c0 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
368d0 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
368e0 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
368f0 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
36900 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
36910 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
36920 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
36930 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
36940 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
36950 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
36960 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
36970 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
36980 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
36990 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
369a0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
369b0 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
369c0 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
369d0 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
369e0 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
369f0 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
36a00 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
36a10 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
36a20 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
36a30 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
36a40 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
36a50 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
36a60 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
36a70 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
36a80 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
36a90 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
36aa0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
36ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36ac0 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
36ad0 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
36ae0 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
36af0 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
36b00 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
36b10 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36b20 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
36b30 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
36b40 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
36b50 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
36b60 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
36b70 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
36b80 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
36b90 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
36ba0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
36bb0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
36bc0 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
36bd0 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
36be0 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
36bf0 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
36c00 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
36c10 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
36c20 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
36c30 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
36c40 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
36c50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
36c60 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
36c70 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
36c80 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
36c90 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
36ca0 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
36cb0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
36cc0 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
36cd0 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
36ce0 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
36cf0 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
36d00 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
36d10 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
36d20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
36d30 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
36d40 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c  if( osMkdir(buf,
36d50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
36d60 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
36d70 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
36d80 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
36d90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
36da0 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
36db0 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
36dc0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
36dd0 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
36de0 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
36df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e00 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
36e10 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
36e20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36e30 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
36e40 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
36e50 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
36e60 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
36e70 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
36e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36e90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
36ea0 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
36eb0 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
36ec0 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
36ed0 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
36ee0 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
36ef0 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
36f00 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
36f10 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
36f20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
36f30 61 74 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79  atic int isProxy
36f40 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78  LockingMode(unix
36f50 46 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20  File *pFile) {. 
36f60 20 72 65 74 75 72 6e 20 28 70 46 69 6c 65 2d 3e   return (pFile->
36f70 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
36f80 79 49 6f 4d 65 74 68 6f 64 73 29 20 3f 20 31 20  yIoMethods) ? 1 
36f90 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  : 0;.}../*.** Re
36fa0 74 75 72 6e 20 74 68 65 20 73 68 61 72 65 64 20  turn the shared 
36fb0 6d 65 6d 6f 72 79 20 62 61 73 65 20 70 61 74 68  memory base path
36fc0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6c 6f   based on the lo
36fd0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 69 66  ck proxy file if
36fe0 20 74 68 65 20 0a 2a 2a 20 6c 6f 63 6b 20 70 72   the .** lock pr
36ff0 6f 78 79 20 66 69 6c 65 20 69 73 20 68 6f 73 74  oxy file is host
37000 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 20 6d  ed on a shared m
37010 65 6d 6f 72 79 20 63 6f 6d 70 61 74 69 62 6c 65  emory compatible
37020 20 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f   FS.*/.static co
37030 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53  nst char *proxyS
37040 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50  haredMemoryBaseP
37050 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
37060 69 6c 65 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ile) {.  proxyLo
37070 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
37080 74 78 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  tx;.  unixFile *
37090 70 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 0a 20 20  pLockFile;.  .  
370a0 61 73 73 65 72 74 28 70 46 69 6c 65 21 3d 4e 55  assert(pFile!=NU
370b0 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  LL && pFile->loc
370c0 6b 69 6e 67 43 6f 6e 74 65 78 74 21 3d 4e 55 4c  kingContext!=NUL
370d0 4c 29 3b 0a 20 20 61 73 73 65 72 74 28 70 46 69  L);.  assert(pFi
370e0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
370f0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b  proxyIoMethods);
37100 0a 20 20 70 43 74 78 20 3d 20 28 28 70 72 6f 78  .  pCtx = ((prox
37110 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37120 2a 29 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *)(pFile->lockin
37130 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 4c  gContext));.  pL
37140 6f 63 6b 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  ockFile = pCtx->
37150 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 69 66 28  lockProxy;.  if(
37160 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70 4d 65 74   pLockFile->pMet
37170 68 6f 64 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32  hod->iVersion>=2
37180 20 26 26 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70   && pLockFile->p
37190 4d 65 74 68 6f 64 2d 3e 78 53 68 6d 4d 61 70 21  Method->xShmMap!
371a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
371b0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
371c0 50 61 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Path;.  }.  retu
371d0 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn NULL;.}../*.*
371e0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
371f0 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
37200 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
37210 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
37220 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
37230 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
37240 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
37250 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
37260 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
37270 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
37280 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
37290 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
372a0 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
372b0 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
372c0 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
372d0 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
372e0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
372f0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
37300 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37310 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
37320 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
37330 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
37340 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
37350 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
37360 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
37370 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
37380 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
37390 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
373a0 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
373b0 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
373c0 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
373d0 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
373e0 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
373f0 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
37400 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
37410 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
37420 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37430 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
37440 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
37450 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
37460 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
37470 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
37480 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
37490 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
374a0 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
374b0 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
374c0 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
374d0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
374e0 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
374f0 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
37500 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
37510 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
37520 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
37530 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
37540 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
37550 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
37560 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
37570 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
37580 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
37590 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
375a0 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
375b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
375c0 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
375d0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
375e0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
375f0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
37600 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
37610 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
37620 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
37630 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
37640 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
37650 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
37660 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
37670 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
37680 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
37690 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
376a0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
376b0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
376c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
376d0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
376e0 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
376f0 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
37700 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
37710 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
37720 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
37730 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
37740 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
37750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
37760 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
37770 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
37780 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
37790 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
377a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
377b0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
377c0 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
377d0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
377e0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
377f0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
37800 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
37810 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
37820 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
37830 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
37840 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
37850 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
37860 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 6c  ed);.    if( isl
37870 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
37880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37890 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
378a0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
378b0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
378c0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
378d0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
378e0 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
378f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37900 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
37910 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
37920 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
37930 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
37940 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
37950 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
37960 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
37970 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
37980 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
37990 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
379a0 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
379b0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
379c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
379d0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
379e0 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
379f0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
37a00 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
37a10 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
37a20 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
37a30 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74  nFlags;.  memset
37a40 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73  (&dummyVfs, 0, s
37a50 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29  izeof(dummyVfs))
37a60 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
37a70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
37a80 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
37a90 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61  ;.  dummyVfs.zNa
37aa0 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20  me = "dummy";.  
37ab0 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
37ac0 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61  ;.  pUnused->fla
37ad0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
37ae0 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20    pNew->pUnused 
37af0 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20  = pUnused;.  .  
37b00 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
37b10 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
37b20 64 2c 20 30 2c 20 28 73 71 6c 69 74 65 33 5f 66  d, 0, (sqlite3_f
37b30 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c  ile*)pNew, path,
37b40 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
37b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37b60 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
37b70 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
37b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
37b90 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
37ba0 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63  :    .  robust_c
37bb0 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f  lose(pNew, fd, _
37bc0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69  _LINE__);.  sqli
37bd0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
37be0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
37bf0 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
37c00 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
37c10 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
37c20 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
37c30 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
37c40 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
37c50 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
37c60 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
37c70 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
37c80 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
37c90 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
37ca0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
37cb0 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
37cc0 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73  /../* Not always
37cd0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
37ce0 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75  headers as it ou
37cf0 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74  ght to be */.ext
37d00 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75  ern int gethostu
37d10 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63  uid(uuid_t id, c
37d20 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
37d30 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a  spec *wait);../*
37d40 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
37d50 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
37d60 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
37d70 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
37d80 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
37d90 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
37da0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
37db0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
37dc0 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
37dd0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
37de0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73   *pError){.  ass
37df0 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44  ert(PROXY_HOSTID
37e00 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75  LEN == sizeof(uu
37e10 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  id_t));.  memset
37e20 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f  (pHostID, 0, PRO
37e30 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23  XY_HOSTIDLEN);.#
37e40 69 66 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55  if HAVE_GETHOSTU
37e50 55 49 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  UID.  {.    stru
37e60 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
37e70 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
37e80 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
37e90 2f 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 67  /.    .    if( g
37ea0 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74  ethostuuid(pHost
37eb0 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b  ID, &timeout) ){
37ec0 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d  .      int err =
37ed0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
37ee0 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
37ef0 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72      *pError = er
37f00 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
37f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
37f20 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
37f30 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
37f40 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29  ARAMETER(pError)
37f50 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
37f60 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
37f70 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
37f80 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
37f90 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
37fa0 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
37fb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
37fc0 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b  ostid_num != 0){
37fd0 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20  .    pHostID[0] 
37fe0 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44  = (char)(pHostID
37ff0 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c  [0] + (char)(sql
38000 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
38010 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65  & 0xFF));.  }.#e
38020 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e  ndif.  .  return
38030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
38040 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
38050 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65   contains the he
38060 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e  ader, host id an
38070 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
38080 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  . */.#define PRO
38090 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
380a0 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65  2   /* 1-byte he
380b0 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f  ader, 16-byte ho
380c0 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23  st id, path */.#
380d0 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41  define PROXY_HEA
380e0 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a  DERLEN    1   /*
380f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64   conch file head
38100 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65  er length */.#de
38110 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49  fine PROXY_PATHI
38120 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48  NDEX    (PROXY_H
38130 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
38140 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e  OSTIDLEN).#defin
38150 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  e PROXY_MAXCONCH
38160 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44  LEN  (PROXY_HEAD
38170 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
38180 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e  IDLEN+MAXPATHLEN
38190 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20  )../* .** Takes 
381a0 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69  an open conch fi
381b0 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63  le, copies the c
381c0 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77  ontents to a new
381d0 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d   path and then m
381e0 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b  oves .** it back
381f0 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65  .  The newly cre
38200 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65  ated file's file
38210 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
38220 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a  ssigned to the.*
38230 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72  * conch file str
38240 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c  ucture and final
38250 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ly the original 
38260 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72  conch file descr
38270 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f  iptor is .** clo
38280 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65  sed.  Returns ze
38290 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ro if successful
382a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
382b0 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
382c0 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
382d0 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
382e0 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  stID){.  proxyLo
382f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
38300 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
38310 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
38320 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
38330 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
38340 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
38350 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63  ->conchFile;.  c
38360 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54  har tPath[MAXPAT
38370 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75  HLEN];.  char bu
38380 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
38390 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50  LEN];.  char *cP
383a0 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ath = pCtx->conc
383b0 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a  hFilePath;.  siz
383c0 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  e_t readLen = 0;
383d0 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65  .  size_t pathLe
383e0 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72  n = 0;.  char er
383f0 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20  rmsg[64] = "";. 
38400 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
38410 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55  int rc = -1;.  U
38420 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
38430 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a  myHostID);..  /*
38440 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
38450 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68  th by replace th
38460 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e  e trailing '-con
38470 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b  ch' with '-break
38480 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d  ' */.  pathLen =
38490 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20   strlcpy(tPath, 
384a0 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  cPath, MAXPATHLE
384b0 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65  N);.  if( pathLe
384c0 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20  n>MAXPATHLEN || 
384d0 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20  pathLen<6 || .  
384e0 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61     (strlcpy(&tPa
384f0 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22  th[pathLen-5], "
38500 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29  break", 6) != 5)
38510 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
38520 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
38530 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
38540 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20  path error (len 
38550 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65  %d)",(int)pathLe
38560 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
38570 5f 62 72 65 61 6b 6c 6