/ Hex Artifact Content
Login

Artifact e29ad5a4214511a5bdb9c2cd31ed8d949f4282b6f07d0e35d2a06be77e388153:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53  #define SQLITE_S
0860: 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 20 31 20  HARED_MAPPING 1 
0870: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20  */../*.** There 
0880: 61 72 65 20 76 61 72 69 6f 75 73 20 6d 65 74 68  are various meth
0890: 6f 64 73 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63  ods for file loc
08a0: 6b 69 6e 67 20 75 73 65 64 20 66 6f 72 20 63 6f  king used for co
08b0: 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20 63 6f 6e  ncurrency.** con
08c0: 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  trol:.**.**   1.
08d0: 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 28   POSIX locking (
08e0: 74 68 65 20 64 65 66 61 75 6c 74 29 2c 0a 2a 2a  the default),.**
08f0: 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b 69 6e 67     2. No locking
0900: 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74 2d 66 69  ,.**   3. Dot-fi
0910: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20  le locking,.**  
0920: 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b   4. flock() lock
0930: 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20 41 46 50  ing,.**   5. AFP
0940: 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58 20 6f 6e   locking (OSX on
0950: 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20 4e 61 6d  ly),.**   6. Nam
0960: 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f  ed POSIX semapho
0970: 72 65 73 20 28 56 58 57 6f 72 6b 73 20 6f 6e 6c  res (VXWorks onl
0980: 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70 72 6f 78  y),.**   7. prox
0990: 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f 53 58 20  y locking. (OSX 
09a0: 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53 74 79 6c  only).**.** Styl
09b0: 65 73 20 34 2c 20 35 2c 20 61 6e 64 20 37 20 61  es 4, 5, and 7 a
09c0: 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  re only availabl
09d0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  e of SQLITE_ENAB
09e0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
09f0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 20 74  .** is defined t
0a00: 6f 20 31 2e 20 20 54 68 65 20 53 51 4c 49 54 45  o 1.  The SQLITE
0a10: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0a20: 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e 61 62 6c  STYLE also enabl
0a30: 65 73 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20  es automatic.** 
0a40: 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  selection of the
0a50: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
0a60: 6b 69 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64  king style based
0a70: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   on the filesyst
0a80: 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  em.** where the 
0a90: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 61  database is loca
0aa0: 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66 20 21 64  ted.  .*/.#if !d
0ab0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0ac0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0ad0: 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65  LE).#  if define
0ae0: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20  d(__APPLE__).#  
0af0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0b00: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0b10: 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23  TYLE 1.#  else.#
0b20: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0b30: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0b40: 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69  _STYLE 0.#  endi
0b50: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 55 73 65  f.#endif../* Use
0b60: 20 70 72 65 61 64 28 29 20 61 6e 64 20 70 77 72   pread() and pwr
0b70: 69 74 65 28 29 20 69 66 20 74 68 65 79 20 61 72  ite() if they ar
0b80: 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 23  e available */.#
0b90: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ba0: 4c 45 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 48  LE__).# define H
0bb0: 41 56 45 5f 50 52 45 41 44 20 31 0a 23 20 64 65  AVE_PREAD 1.# de
0bc0: 66 69 6e 65 20 48 41 56 45 5f 50 57 52 49 54 45  fine HAVE_PWRITE
0bd0: 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   1.#endif.#if de
0be0: 66 69 6e 65 64 28 48 41 56 45 5f 50 52 45 41 44  fined(HAVE_PREAD
0bf0: 36 34 29 20 26 26 20 64 65 66 69 6e 65 64 28 48  64) && defined(H
0c00: 41 56 45 5f 50 57 52 49 54 45 36 34 29 0a 23 20  AVE_PWRITE64).# 
0c10: 75 6e 64 65 66 20 55 53 45 5f 50 52 45 41 44 0a  undef USE_PREAD.
0c20: 23 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  # define USE_PRE
0c30: 41 44 36 34 20 31 0a 23 65 6c 69 66 20 64 65 66  AD64 1.#elif def
0c40: 69 6e 65 64 28 48 41 56 45 5f 50 52 45 41 44 29  ined(HAVE_PREAD)
0c50: 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45   && defined(HAVE
0c60: 5f 50 57 52 49 54 45 29 0a 23 20 75 6e 64 65 66  _PWRITE).# undef
0c70: 20 55 53 45 5f 50 52 45 41 44 36 34 0a 23 20 64   USE_PREAD64.# d
0c80: 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
0c90: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
0ca0: 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75 64 65  standard include
0cb0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c   files..*/.#incl
0cc0: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68  ude <sys/types.h
0cd0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0ce0: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  stat.h>.#include
0cf0: 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c   <fcntl.h>.#incl
0d00: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0d10: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  >.#include <unis
0d20: 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  td.h>.#include <
0d30: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
0d40: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69   <sys/time.h>.#i
0d50: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0d60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0d70: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
0d80: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
0d90: 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63 6c 75  P_SIZE>0.# inclu
0da0: 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a  de <sys/mman.h>.
0db0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
0dc0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0dd0: 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64  G_STYLE.# includ
0de0: 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a  e <sys/ioctl.h>.
0df0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 66  # include <sys/f
0e00: 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ile.h>.# include
0e10: 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23   <sys/param.h>.#
0e20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0e30: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0e40: 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66  TYLE */..#if def
0e50: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
0e60: 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f 58 5f  && ((__MAC_OS_X_
0e70: 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
0e80: 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c 7c 20  IRED > 1050) || 
0e90: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 5f 5f               (__
0eb0: 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53 49 4f  IPHONE_OS_VERSIO
0ec0: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
0ed0: 20 32 30 30 30 29 29 0a 23 20 20 69 66 20 28 21   2000)).#  if (!
0ee0: 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 4f  defined(TARGET_O
0ef0: 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c 20 28  S_EMBEDDED) || (
0f00: 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44 44  TARGET_OS_EMBEDD
0f10: 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20 20 20  ED==0)) \.      
0f20: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 54 41   && (!defined(TA
0f30: 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55  RGET_IPHONE_SIMU
0f40: 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52 47 45  LATOR) || (TARGE
0f50: 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54  T_IPHONE_SIMULAT
0f60: 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64 65 66  OR==0)).#    def
0f70: 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f 53 54  ine HAVE_GETHOST
0f80: 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65 0a 23  UUID 1.#  else.#
0f90: 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67 65 74      warning "get
0fa0: 68 6f 73 74 75 75 69 64 28 29 20 69 73 20 64 69  hostuuid() is di
0fb0: 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e 64 69  sabled.".#  endi
0fc0: 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 4f  f.#endif...#if O
0fd0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c  S_VXWORKS.# incl
0fe0: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0ff0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d  >.# include <sem
1000: 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e 63 6c  aphore.h>.# incl
1010: 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23  ude <limits.h>.#
1020: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1030: 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  RKS */..#if defi
1040: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1050: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
1060: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20  LOCKING_STYLE.# 
1070: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75  include <sys/mou
1080: 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  nt.h>.#endif..#i
1090: 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a  fdef HAVE_UTIME.
10a0: 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d 65  # include <utime
10b0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .h>.#endif../*.*
10c0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
10d0: 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73 46   of unixFile.fsF
10e0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
10f0: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
1100: 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31 0a  S_MSDOS     0x1.
1110: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
1120: 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61   to be thread-sa
1130: 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20  fe, include the 
1140: 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20  pthreads header 
1150: 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68  and define.** th
1160: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
1170: 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  READS macro..*/.
1180: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
1190: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
11a0: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65  <pthread.h>.# de
11b0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58  fine SQLITE_UNIX
11c0: 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69  _THREADS 1.#endi
11d0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  f../*.** Default
11e0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65   permissions whe
11f0: 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  n creating a new
1200: 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66   file.*/.#ifndef
1210: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1220: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1230: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1240: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1250: 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23  RMISSIONS 0644.#
1260: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1270: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
1280: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
1290: 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a 2f  uto proxy dir.*/
12a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12b0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
12c0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64  _PERMISSIONS.# d
12d0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46  efine SQLITE_DEF
12e0: 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
12f0: 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a 23  RMISSIONS 0755.#
1300: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
1310: 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
1320: 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23  ath-length..*/.#
1330: 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e  define MAX_PATHN
1340: 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4d  AME 512../*.** M
1350: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
1360: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 0a   symbolic links.
1370: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  */.#define SQLIT
1380: 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 31  E_MAX_SYMLINKS 1
1390: 30 30 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63 61  00../* Always ca
13a0: 73 74 20 74 68 65 20 67 65 74 70 69 64 28 29 20  st the getpid() 
13b0: 72 65 74 75 72 6e 20 74 79 70 65 20 66 6f 72 20  return type for 
13c0: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
13d0: 74 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f 64  th.** kernel mod
13e0: 75 6c 65 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e  ules in VxWorks.
13f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   */.#define osGe
1400: 74 70 69 64 28 58 29 20 28 70 69 64 5f 74 29 67  tpid(X) (pid_t)g
1410: 65 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20 4f  etpid()../*.** O
1420: 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73 74  nly set the last
1430: 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72  Errno if the err
1440: 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65 61  or code is a rea
1450: 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20  l error and not 
1460: 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70  .** a normal exp
1470: 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64  ected return cod
1480: 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59  e of SQLITE_BUSY
1490: 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f   or SQLITE_OK.*/
14a0: 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b  .#define IS_LOCK
14b0: 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20 21  _ERROR(x)  ((x !
14c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  = SQLITE_OK) && 
14d0: 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53  (x != SQLITE_BUS
14e0: 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  Y))../* Forward 
14f0: 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79  references */.ty
1500: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1510: 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20 20  xShm unixShm;   
1520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1530: 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65 64  onnection shared
1540: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64   memory */.typed
1550: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  ef struct unixSh
1560: 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f 64  mNode unixShmNod
1570: 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72  e;       /* Shar
1580: 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61 6e  ed memory instan
1590: 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce */.typedef st
15a0: 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ruct unixInodeIn
15b0: 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  fo unixInodeInfo
15c0: 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65  ;   /* An i-node
15d0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
15e0: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
15f0: 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20 20  UnixUnusedFd;   
1600: 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20 66    /* An unused f
1610: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1620: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  /../*.** Sometim
1630: 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65  es, after a file
1640: 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65   handle is close
1650: 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65  d by SQLite, the
1660: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1670: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c  .** cannot be cl
1680: 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  osed immediately
1690: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
16a0: 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  , instances of t
16b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
16c0: 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75 73  structure are us
16d0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
16e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16f0: 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f  while waiting fo
1700: 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e  r an.** opportun
1710: 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c  ity to either cl
1720: 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e  ose or reuse it.
1730: 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78 55  .*/.struct UnixU
1740: 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20  nusedFd {.  int 
1750: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1760: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
1770: 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73  scriptor to clos
1780: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17a0: 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66   /* Flags this f
17b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
17c0: 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a  as opened with *
17d0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
17e0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
17f0: 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c   Next unused fil
1800: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
1810: 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  same file */.};.
1820: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46  ./*.** The unixF
1830: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1840: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
1850: 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66  ite3_file specif
1860: 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a  ic to the unix.*
1870: 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  * VFS implementa
1880: 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tions..*/.typede
1890: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
18a0: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
18b0: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
18c0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
18d0: 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f  ds const *pMetho
18e0: 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68  d;  /* Always th
18f0: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f  e first entry */
1900: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1910: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  pVfs;           
1920: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
1930: 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  S that created t
1940: 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a  his unixFile */.
1950: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1960: 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
1970: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
1980: 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69  out locks on thi
1990: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
19a0: 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
19d0: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73  criptor */.  uns
19e0: 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65  igned char eFile
19f0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
1a00: 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20   /* The type of 
1a10: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69  lock held on thi
1a20: 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  s fd */.  unsign
1a30: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72  ed short int ctr
1a40: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a  lFlags;       /*
1a50: 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73   Behavioral bits
1a60: 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  .  UNIXFILE_* fl
1a70: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73  ags */.  int las
1a80: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa0: 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66  The unix errno f
1ab0: 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  rom last I/O err
1ac0: 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f  or */.  void *lo
1ad0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1af0: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65  ocking style spe
1b00: 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20  cific state */. 
1b10: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
1b20: 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
1b30: 65 64 3b 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f  ed;  /* Pre-allo
1b40: 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64  cated UnixUnused
1b50: 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  Fd */.  const ch
1b60: 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20  ar *zPath;      
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b80: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1b90: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53  */.  unixShm *pS
1ba0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1bc0: 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed memory segmen
1bd0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
1be0: 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20  .  int szChunk; 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
1c10: 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48  ured by FCNTL_CH
1c20: 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20  UNK_SIZE */.#if 
1c30: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1c40: 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65  SIZE>0.  int nFe
1c50: 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20  tchOut;         
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c70: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
1c80: 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66  nding xFetch ref
1c90: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
1ca0: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20  nt64 mmapSize;  
1cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1cc0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70  able size of map
1cd0: 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69  ping at pMapRegi
1ce0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
1cf0: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63  int64 mmapSizeAc
1d00: 74 75 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41  tual;       /* A
1d10: 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61  ctual size of ma
1d20: 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67  pping at pMapReg
1d30: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
1d40: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d  _int64 mmapSizeM
1d50: 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ax;          /* 
1d60: 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c  Configured FCNTL
1d70: 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65  _MMAP_SIZE value
1d80: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70   */.  void *pMap
1d90: 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
1db0: 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67 69 6f  ory mapped regio
1dc0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e  n */.#endif.  in
1dd0: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63 74    /* Device sect
1e00: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  or size */.  int
1e10: 20 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72   deviceCharacter
1e20: 69 73 74 69 63 73 3b 20 20 20 20 20 20 20 20 20  istics;         
1e30: 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64 20   /* Precomputed 
1e40: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1e50: 69 73 74 69 63 73 20 2a 2f 0a 23 69 66 20 53 51  istics */.#if SQ
1e60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e70: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1e80: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1eb0: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1ec0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1ed0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1ee0: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1ef0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1f10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f20: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1f30: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1f40: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1f50: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1f60: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1f70: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1f80: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1f90: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1fa0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1fb0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1fc0: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1fd0: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1fe0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1ff0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2000: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2010: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
2020: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
2030: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
2040: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
2050: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
2060: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
2070: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2080: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2090: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
20a0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
20b0: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
20c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20d0: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
20e0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
20f0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2100: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
2110: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
2120: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2130: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2140: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2150: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2160: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2170: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2180: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2190: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21a0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
21b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
21c0: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
21d0: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
21e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21f0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2200: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2210: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2220: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2230: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2240: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
2250: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
2260: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
2270: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2280: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2290: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
22a0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
22b0: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
22c0: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
22d0: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
22e0: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
22f0: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2300: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2310: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2320: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2330: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2340: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
2350: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
2360: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
2370: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2380: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
2390: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
23a0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
23b0: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
23c0: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
23d0: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
23e0: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
23f0: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2400: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2410: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2420: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2430: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2440: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
2450: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
2460: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
2470: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
2480: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
2490: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
24a0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
24b0: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
24c0: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
24d0: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
24e0: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
24f0: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2500: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2510: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2520: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2530: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2540: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
2550: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
2560: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
2570: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
2580: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
2590: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
25a0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
25b0: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
25c0: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
25d0: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
25e0: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
25f0: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2600: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2610: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2620: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2630: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2640: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
2650: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
2660: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2670: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
2680: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
2690: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
26a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
26b0: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
26c0: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
26d0: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
26e0: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
26f0: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2700: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2710: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2720: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2730: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2740: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
2750: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
2760: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
2770: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
2780: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
2790: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
27a0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
27b0: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
27c0: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
27d0: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
27e0: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
27f0: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2800: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2810: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2820: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2830: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2840: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
2850: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
2860: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
2870: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
2880: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
2890: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
28a0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
28b0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
28c0: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
28d0: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
28e0: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
28f0: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2900: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2910: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2920: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2930: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2940: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
2950: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
2960: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
2970: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
2980: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
2990: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
29a0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
29b0: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
29c0: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
29d0: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
29e0: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
29f0: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2a00: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2a10: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2a20: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2a30: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2a40: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
2a50: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
2a60: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
2a70: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 6c  ndif..#ifdef __l
2a80: 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 4c 69 6e  inux__./*.** Lin
2a90: 75 78 2d 73 70 65 63 69 66 69 63 20 49 4f 43 54  ux-specific IOCT
2aa0: 4c 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 20  L magic numbers 
2ab0: 75 73 65 64 20 66 6f 72 20 63 6f 6e 74 72 6f 6c  used for control
2ac0: 6c 69 6e 67 20 46 32 46 53 0a 2a 2f 0a 23 64 65  ling F2FS.*/.#de
2ad0: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 54 4c 5f  fine F2FS_IOCTL_
2ae0: 4d 41 47 49 43 20 20 20 20 20 20 20 20 30 78 66  MAGIC        0xf
2af0: 35 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  5.#define F2FS_I
2b00: 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f  OC_START_ATOMIC_
2b10: 57 52 49 54 45 20 20 20 20 20 5f 49 4f 28 46 32  WRITE     _IO(F2
2b20: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20  FS_IOCTL_MAGIC, 
2b30: 31 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  1).#define F2FS_
2b40: 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  IOC_COMMIT_ATOMI
2b50: 43 5f 57 52 49 54 45 20 20 20 20 5f 49 4f 28 46  C_WRITE    _IO(F
2b60: 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c  2FS_IOCTL_MAGIC,
2b70: 20 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53   2).#define F2FS
2b80: 5f 49 4f 43 5f 53 54 41 52 54 5f 56 4f 4c 41 54  _IOC_START_VOLAT
2b90: 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f 28  ILE_WRITE   _IO(
2ba0: 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43  F2FS_IOCTL_MAGIC
2bb0: 2c 20 33 29 0a 23 64 65 66 69 6e 65 20 46 32 46  , 3).#define F2F
2bc0: 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41  S_IOC_ABORT_VOLA
2bd0: 54 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f  TILE_WRITE   _IO
2be0: 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49  (F2FS_IOCTL_MAGI
2bf0: 43 2c 20 35 29 0a 23 64 65 66 69 6e 65 20 46 32  C, 5).#define F2
2c00: 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55  FS_IOC_GET_FEATU
2c10: 52 45 53 20 20 20 20 20 20 20 20 20 20 20 5f 49  RES           _I
2c20: 4f 52 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  OR(F2FS_IOCTL_MA
2c30: 47 49 43 2c 20 31 32 2c 20 75 33 32 29 0a 23 64  GIC, 12, u32).#d
2c40: 65 66 69 6e 65 20 46 32 46 53 5f 46 45 41 54 55  efine F2FS_FEATU
2c50: 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  RE_ATOMIC_WRITE 
2c60: 30 78 30 30 30 34 0a 23 65 6e 64 69 66 20 2f 2a  0x0004.#endif /*
2c70: 20 5f 5f 6c 69 6e 75 78 5f 5f 20 2a 2f 0a 0a 0a   __linux__ */...
2c80: 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  /*.** Different 
2c90: 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63  Unix systems dec
2ca0: 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64  lare open() in d
2cb0: 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20  ifferent ways.  
2cc0: 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e  Same use.** open
2cd0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2ce0: 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72  ,mode_t).  Other
2cf0: 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74  s use open(const
2d00: 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e   char*,int,...).
2d10: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2d20: 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ce is important 
2d30: 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69  when using a poi
2d40: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63  nter to the func
2d50: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
2d60: 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65  safest way to de
2d70: 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62  al with the prob
2d80: 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73  lem is to always
2d90: 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65   use this wrappe
2da0: 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79  r.** which alway
2db0: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77  s has the same w
2dc0: 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65  ell-defined inte
2dd0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
2de0: 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63   int posixOpen(c
2df0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2e00: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
2e10: 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e   mode){.  return
2e20: 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61   open(zFile, fla
2e30: 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  gs, mode);.}../*
2e40: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2e50: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2e60: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2e70: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2e80: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2e90: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2ea0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2eb0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2ec0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2ed0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2ee0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2ef0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2f00: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2f10: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2f20: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2f30: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2f40: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2f50: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2f60: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2f70: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2f80: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2f90: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2fa0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2fb0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2fc0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2fd0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ff0: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3000: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3010: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3020: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
3030: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
3040: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
3050: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3060: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3070: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3080: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3090: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
30a0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
30b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
30c0: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
30d0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
30e0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
30f0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
3100: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
3110: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
3120: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
3130: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3140: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
3150: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
3160: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
3170: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
3180: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3190: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
31a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31b0: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
31c0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31d0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
31e0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
31f0: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3200: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3210: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3220: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3230: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3240: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3250: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
3260: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
3270: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
3280: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3290: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
32a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
32b0: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
32c0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
32d0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
32e0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
32f0: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3300: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3310: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3320: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3330: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3340: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
3350: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
3360: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
3370: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
3380: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
3390: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
33a0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
33b0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
33c0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
33d0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
33e0: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
33f0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3400: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3410: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3420: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3430: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3440: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3450: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3460: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
3470: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
3480: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
3490: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
34a0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
34b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
34c0: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
34d0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
34e0: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
34f0: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3500: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3510: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3520: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3530: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3540: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
3550: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
3560: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3570: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
3580: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
3590: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35a0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
35b0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
35c0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
35d0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
35e0: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
35f0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3600: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3610: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3620: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3630: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3640: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
3650: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3660: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3670: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
3680: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3690: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
36a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
36b0: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
36c0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
36d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
36e0: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
36f0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3700: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3710: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3720: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3730: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3740: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
3750: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3760: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3770: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
3780: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3790: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
37a0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
37b0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
37c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
37d0: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
37e0: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
37f0: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3800: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3810: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3820: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3830: 6f 73 50 72 65 61 64 36 34 20 28 28 73 73 69 7a  osPread64 ((ssiz
3840: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
3850: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
3860: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
3870: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
3880: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
3890: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
38a0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
38b0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
38c0: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
38d0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
38e0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
38f0: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3900: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3910: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3920: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3930: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3940: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3950: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3960: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3970: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3980: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
3990: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
39a0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
39b0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
39c0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
39d0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
39e0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
39f0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a10: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3a20: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a30: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3a40: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3a50: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3a60: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3a70: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3a80: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3a90: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3aa0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3ab0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3ac0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3ad0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3ae0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3af0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3b00: 66 66 36 34 5f 74 29 29 5c 0a 20 20 20 20 20 20  ff64_t))\.      
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3b20: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3b30: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3b40: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3b50: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3b60: 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20 20  chmod,          
3b70: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3b80: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
3b90: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
3ba0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3bb0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3bc0: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
3bd0: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
3be0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3bf0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3c00: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3c10: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
3c20: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
3c30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
3c40: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3c50: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3c60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3c70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3c80: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
3c90: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3ca0: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
3cb0: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3cc0: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
3cd0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3ce0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
3cf0: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
3d00: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
3d10: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
3d20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3d30: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
3d40: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
3d50: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
3d60: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3d70: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
3d80: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
3d90: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
3da0: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
3db0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
3dc0: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3dd0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
3de0: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
3df0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3e00: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
3e10: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3e20: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
3e30: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
3e40: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3e50: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
3e60: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
3e70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3e80: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
3e90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3ea0: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
3eb0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3ec0: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3ed0: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
3ee0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3ef0: 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66 63  _FCHOWN).  { "fc
3f00: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3f10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3f20: 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20 20  r)fchown,       
3f30: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3f40: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3f50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3f60: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3f70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3f80: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
3f90: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3fa0: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
3fb0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
3fc0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
3fd0: 65 74 65 75 69 64 22 2c 20 20 20 20 20 20 28 73  eteuid",      (s
3fe0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ff0: 74 72 29 67 65 74 65 75 69 64 2c 20 20 20 20 20  tr)geteuid,     
4000: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
4010: 20 6f 73 47 65 74 65 75 69 64 20 20 20 28 28 75   osGeteuid   ((u
4020: 69 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61 53  id_t(*)(void))aS
4030: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
4040: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4050: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
4060: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
4070: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
4080: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
4090: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
40a0: 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20  ll_ptr)mmap,    
40b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
40c0: 73 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  se.  { "mmap",  
40d0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
40e0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4100: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
4110: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
4120: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
4130: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
4140: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  t))aSyscall[22].
4150: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4170: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4180: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
4190: 3e 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c  >0.  { "munmap",
41a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
41b0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d  syscall_ptr)munm
41c0: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
41d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75 6e  ,.#else.  { "mun
41e0: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
41f0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4200: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4210: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
4220: 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28  efine osMunmap (
4230: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
4240: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
4250: 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [23].pCurrent)..
4260: 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  #if HAVE_MREMAP 
4270: 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c  && (!defined(SQL
4280: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
4290: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
42a0: 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 6d 72  _SIZE>0).  { "mr
42b0: 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  emap",       (sq
42c0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
42d0: 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20  r)mremap,       
42e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
42f0: 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20  { "mremap",     
4300: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
4310: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
4320: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4330: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72  dif.#define osMr
4340: 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  emap ((void*(*)(
4350: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a  void*,size_t,siz
4360: 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  e_t,int,...))aSy
4370: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
4380: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
4390: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
43a0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
43b0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
43c0: 20 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20   "getpagesize", 
43d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
43e0: 6c 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61 67  l_ptr)unixGetpag
43f0: 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  esize, 0 },.#els
4400: 65 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73 69  e.  { "getpagesi
4410: 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73  ze",  (sqlite3_s
4420: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
4430: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4440: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4450: 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28  osGetpagesize ((
4460: 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79  int(*)(void))aSy
4470: 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65  scall[25].pCurre
4480: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
4490: 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29 0a  (HAVE_READLINK).
44a0: 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20    { "readlink", 
44b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
44c0: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69 6e  call_ptr)readlin
44d0: 6b 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  k,        0 },.#
44e0: 65 6c 73 65 0a 20 20 7b 20 22 72 65 61 64 6c 69  else.  { "readli
44f0: 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  nk",     (sqlite
4500: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4520: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4530: 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b 20 28 28  ne osReadlink ((
4540: 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f 6e 73 74  ssize_t(*)(const
4550: 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c 73 69 7a   char*,char*,siz
4560: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 36  e_t))aSyscall[26
4570: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4580: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53   defined(HAVE_LS
4590: 54 41 54 29 0a 20 20 7b 20 22 6c 73 74 61 74 22  TAT).  { "lstat"
45a0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
45b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6c  e3_syscall_ptr)l
45c0: 73 74 61 74 2c 20 20 20 20 20 20 20 20 20 20 30  stat,          0
45d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6c   },.#else.  { "l
45e0: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28  stat",         (
45f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4600: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
4610: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4620: 23 64 65 66 69 6e 65 20 6f 73 4c 73 74 61 74 20  #define osLstat 
4630: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
4640: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
4650: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
4660: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
4670: 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20 20    { "ioctl",    
4680: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
4690: 73 63 61 6c 6c 5f 70 74 72 29 69 6f 63 74 6c 2c  scall_ptr)ioctl,
46a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
46b0: 64 65 66 69 6e 65 20 6f 73 49 6f 63 74 6c 20 28  define osIoctl (
46c0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c  (int(*)(int,int,
46d0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 38  ...))aSyscall[28
46e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
46f0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
4700: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
4710: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
4720: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
4730: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
4740: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
4750: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
4760: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
4770: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
4780: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
4790: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
47a0: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
47b0: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
47c0: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
47d0: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
47e0: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
47f0: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
4800: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
4810: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
4820: 46 43 48 4f 57 4e 29 0a 20 20 72 65 74 75 72 6e  FCHOWN).  return
4830: 20 6f 73 47 65 74 65 75 69 64 28 29 20 3f 20 30   osGeteuid() ? 0
4840: 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 75   : osFchown(fd,u
4850: 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73 65 0a 20  id,gid);.#else. 
4860: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
4870: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
4880: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
4890: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
48a0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
48b0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
48c0: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
48d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
48e0: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
48f0: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
4900: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
4910: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
4920: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
4930: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
4940: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
4950: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
4960: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4970: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
4980: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4990: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
49a0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
49b0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
49c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
49d0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
49e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
49f0: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
4a00: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
4a10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4a20: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
4a30: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
4a40: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
4a50: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
4a60: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
4a70: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4a80: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
4a90: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
4aa0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
4ab0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
4ac0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
4ad0: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
4ae0: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
4af0: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
4b00: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
4b10: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
4b20: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4b30: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
4b40: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
4b50: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
4b60: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
4b70: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4b80: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
4b90: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
4ba0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
4bb0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4bc0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
4bd0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4be0: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
4bf0: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
4c00: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
4c10: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
4c20: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
4c30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
4c40: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
4c50: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
4c60: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
4c70: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4c80: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4c90: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4ca0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
4cb0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4cc0: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
4cd0: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
4ce0: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
4cf0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4d00: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
4d10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4d20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
4d30: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
4d40: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
4d50: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4d60: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
4d70: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
4d80: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4da0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4db0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4dc0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4dd0: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
4de0: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4df0: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
4e00: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
4e10: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
4e20: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
4e30: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
4e40: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
4e50: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
4e60: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
4e70: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
4e80: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4e90: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
4ea0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
4eb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4ec0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
4ed0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
4ee0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4ef0: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
4f00: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
4f10: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
4f20: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
4f30: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
4f40: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
4f50: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
4f60: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
4f70: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
4f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4f90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4fa0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
4fb0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
4fc0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4fd0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4fe0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4ff0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
5000: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
5010: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
5020: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
5030: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
5040: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
5050: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
5060: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
5070: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
5080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
5090: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
50a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
50b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
50c0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
50d0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
50e0: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
50f0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
5100: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
5110: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
5120: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
5130: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
5140: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
5150: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
5160: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
5170: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
5180: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
5190: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
51a0: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
51b0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
51c0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
51d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
51e0: 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70 74 20  * Do not accept 
51f0: 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  any file descrip
5200: 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 74 68  tor less than th
5210: 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f 72 64  is value, in ord
5220: 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 6f  er to avoid.** o
5230: 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  pening database 
5240: 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c 65 20  file using file 
5250: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
5260: 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73   are commonly us
5270: 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61 6e 64  ed for .** stand
5280: 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74 70 75  ard input, outpu
5290: 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a 2a 2f  t, and error..*/
52a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
52b0: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
52c0: 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69 6e 65  CRIPTOR.# define
52d0: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
52e0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
52f0: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
5300: 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20  Invoke open().  
5310: 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74  Do so multiple t
5320: 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65  imes, until it e
5330: 69 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f  ither succeeds o
5340: 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73  r.** fails for s
5350: 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72  ome reason other
5360: 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a   than EINTR..**.
5370: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63  ** If the file c
5380: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22  reation mode "m"
5390: 20 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69   is 0 then set i
53a0: 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
53b0: 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20   for.** SQLite. 
53c0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
53d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
53e0: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
53f0: 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34  (normally.** 064
5400: 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62  4) as modified b
5410: 79 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61  y the system uma
5420: 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74  sk.  If m is not
5430: 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65   0, then.** make
5440: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
5450: 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74  on mode be exact
5460: 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68  ly m ignoring th
5470: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e umask..**.** T
5480: 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77  he m parameter w
5490: 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ill be non-zero 
54a0: 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69  only when creati
54b0: 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61  ng -wal, -journa
54c0: 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66  l,.** and -shm f
54d0: 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74  iles.  We want t
54e0: 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61  hose files to ha
54f0: 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65  ve *exactly* the
5500: 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73   same.** permiss
5510: 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72  ions as their or
5520: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c  iginal database,
5530: 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62   unadulterated b
5540: 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
5550: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20  In that way, if 
5560: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
5570: 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20  is -rw-rw-rw or 
5580: 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61  -rw-rw-r-, and a
5590: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
55a0: 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76  crashes and leav
55b0: 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f  es behind hot jo
55c0: 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79  urnals, then any
55d0: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
55e0: 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74   is able to writ
55f0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
5600: 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61  e will also be a
5610: 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65  ble to.** recove
5620: 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  r the hot journa
5630: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
5640: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
5650: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
5660: 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20   f, mode_t m){. 
5670: 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f   int fd;.  mode_
5680: 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53  t m2 = m ? m : S
5690: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
56a0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a  LE_PERMISSIONS;.
56b0: 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69 66 20    while(1){.#if 
56c0: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
56d0: 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  C).    fd = osOp
56e0: 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43  en(z,f|O_CLOEXEC
56f0: 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ,m2);.#else.    
5700: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  fd = osOpen(z,f,
5710: 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  m2);.#endif.    
5720: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
5730: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
5740: 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TR ) continue;. 
5750: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5760: 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 53 51  }.    if( fd>=SQ
5770: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
5780: 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29 20 62  E_DESCRIPTOR ) b
5790: 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  reak;.    osClos
57a0: 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(fd);.    sqlit
57b0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
57c0: 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20 20 20  RNING, .        
57d0: 20 20 20 20 20 20 20 20 22 61 74 74 65 6d 70 74          "attempt
57e0: 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20   to open \"%s\" 
57f0: 61 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  as file descript
5800: 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29 3b 0a  or %d", z, fd);.
5810: 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20 20 20      fd = -1;.   
5820: 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f 64 65   if( osOpen("/de
5830: 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29 3c 30  v/null", f, m)<0
5840: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5850: 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
5860: 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
5870: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
5880: 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66  tatbuf;.      if
5890: 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  ( osFstat(fd, &s
58a0: 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20  tatbuf)==0 .    
58b0: 20 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74     && statbuf.st
58c0: 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20  _size==0.       
58d0: 26 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  && (statbuf.st_m
58e0: 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20  ode&0777)!=m .  
58f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f      ){.        o
5900: 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a  sFchmod(fd, m);.
5910: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
5920: 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f  f defined(FD_CLO
5930: 45 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e  EXEC) && (!defin
5940: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c  ed(O_CLOEXEC) ||
5950: 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20   O_CLOEXEC==0). 
5960: 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
5970: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
5980: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
5990: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
59a0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
59b0: 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn fd;.}../*.** 
59c0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
59d0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
59e0: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
59f0: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
5a00: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
5a10: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
5a20: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
5a30: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
5a40: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
5a50: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
5a60: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
5a70: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
5a80: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
5a90: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
5aa0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
5ab0: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
5ac0: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
5ad0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5ae0: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
5af0: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
5b00: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
5b10: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
5b20: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
5b30: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
5b40: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
5b50: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
5b60: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
5b70: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
5b80: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
5b90: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
5ba0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5bb0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
5bc0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
5bd0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
5be0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
5bf0: 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61  IC_VFS1));.}.sta
5c00: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
5c10: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
5c20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5c30: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
5c40: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
5c50: 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29  TEX_STATIC_VFS1)
5c60: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
5c70: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
5c80: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
5c90: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
5ca0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
5cb0: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
5cc0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5cd0: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5ce0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
5cf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
5d00: 45 5f 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  E_OS_TRACE./*.**
5d10: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
5d20: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
5d30: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
5d40: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
5d50: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
5d60: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
5d70: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
5d80: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
5d90: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
5da0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
5db0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5dc0: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
5dd0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
5de0: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
5df0: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
5e00: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
5e10: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
5e20: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
5e30: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
5e40: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
5e50: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
5e60: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
5e70: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
5e80: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
5e90: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
5ea0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
5eb0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
5ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
5ed0: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
5ee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
5ef0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
5f00: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
5f10: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
5f20: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
5f30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5f40: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
5f50: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
5f60: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
5f70: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
5f80: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
5f90: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
5fa0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
5fb0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
5fc0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
5fd0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
5fe0: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
5ff0: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
6000: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
6010: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
6020: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
6030: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
6040: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
6050: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
6060: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
6070: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
6080: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
6090: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
60a0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
60b0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
60c0: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
60d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
60e0: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
60f0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
6100: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
6110: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
6120: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
6130: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
6140: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
6150: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
6160: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
6170: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
6180: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
6190: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
61a0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
61b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
61c0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
61d0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
61e0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
61f0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
6200: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
6210: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
6220: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
6230: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
6240: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
6250: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
6260: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
6270: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
6280: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
6290: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
62a0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
62b0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
62c0: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
62d0: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
62e0: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
62f0: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
6300: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
6310: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
6320: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
6330: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
6340: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
6350: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
6360: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
6370: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
6380: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
6390: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
63a0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
63b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
63c0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
63d0: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
63e0: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
63f0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
6400: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
6410: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
6420: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
6430: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
6440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6450: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
6460: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
6470: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
6480: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
6490: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
64a0: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
64b0: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
64c0: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
64d0: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
64e0: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
64f0: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
6500: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
6510: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
6520: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
6530: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
6540: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
6550: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
6560: 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20   to EINTR.**.** 
6570: 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72  All calls to ftr
6580: 75 6e 63 61 74 65 28 29 20 77 69 74 68 69 6e 20  uncate() within 
6590: 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64  this file should
65a0: 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68   be made through
65b0: 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70 65 72  .** this wrapper
65c0: 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69  .  On the Androi
65d0: 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61  d platform, bypa
65e0: 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20  ssing the logic 
65f0: 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c  below.** could l
6600: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
6610: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
6620: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
6630: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
6640: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
6650: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  z){.  int rc;.#i
6660: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
6670: 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64  .  /* On Android
6680: 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c  , ftruncate() al
6690: 77 61 79 73 20 75 73 65 73 20 33 32 2d 62 69 74  ways uses 32-bit
66a0: 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69   offsets, even i
66b0: 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46  f .  ** _FILE_OF
66c0: 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20  FSET_BITS=64 is 
66d0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65  defined. This me
66e0: 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61 66 65  ans it is unsafe
66f0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20   to attempt to. 
6700: 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66   ** truncate a f
6710: 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20  ile to any size 
6720: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47 69 42  larger than 2GiB
6730: 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  . Silently ignor
6740: 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  e any.  ** such 
6750: 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20  attempts.  */.  
6760: 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f  if( sz>(sqlite3_
6770: 69 6e 74 36 34 29 30 78 37 46 46 46 46 46 46 46  int64)0x7FFFFFFF
6780: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6790: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a  ITE_OK;.  }else.
67a0: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20  #endif.  do{ rc 
67b0: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
67c0: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
67d0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
67e0: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
67f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6800: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
6810: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
6820: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
6830: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
6840: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
6850: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
6860: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
6870: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
6880: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
6890: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
68a0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
68b0: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
68c0: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
68d0: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
68e0: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
68f0: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
6900: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
6910: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
6920: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
6930: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
6940: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
6950: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
6960: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
6970: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
6980: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
6990: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
69a0: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
69b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
69c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
69d0: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
69e0: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
69f0: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73  iteIOErr) {.  as
6a00: 73 65 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45  sert( (sqliteIOE
6a10: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6a20: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
6a30: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6a40: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6a50: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
6a60: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
6a70: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6a80: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
6a90: 7c 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c  |.          (sql
6aa0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6ab0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
6ac0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20  SERVEDLOCK) );. 
6ad0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
6ae0: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41  ror) {.  case EA
6af0: 43 43 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41  CCES: .  case EA
6b00: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
6b10: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
6b20: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
6b30: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
6b40: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
6b50: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
6b60: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
6b70: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
6b80: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
6b90: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
6ba0: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
6bb0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
6bc0: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
6bd0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
6be0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 50 45 52      .  case EPER
6bf0: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
6c00: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
6c10: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
6c20: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
6c30: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  Err;.  }.}.../**
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6ca0: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
6cb0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6cc0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6ce0: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
6cf0: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
6d00: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
6d10: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
6d20: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
6d30: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
6d40: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
6d50: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
6d60: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
6d70: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
6d80: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
6d90: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
6da0: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
6db0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6dc0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
6dd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6de0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6df0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6e00: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
6e10: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
6e20: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
6e30: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
6e40: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
6e50: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
6e60: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
6e70: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
6e80: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
6e90: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6ea0: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
6eb0: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
6ec0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
6ed0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
6ee0: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
6ef0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
6f00: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
6f10: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
6f20: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
6f30: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
6f40: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
6f50: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
6f60: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
6f70: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
6f80: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
6f90: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6fa0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
6fb0: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
6fc0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6fd0: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
6fe0: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
6ff0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
7000: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7020: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
7030: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
7040: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
7070: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
7080: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
7090: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
70a0: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
70b0: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
70c0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
70d0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
70e0: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
70f0: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
7100: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
7110: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
7120: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
7130: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
7140: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
7150: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
7160: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
7170: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
7180: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
7190: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
71a0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
71b0: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
71c0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
71d0: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
71e0: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
71f0: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
7200: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
7210: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
7220: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
7230: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
7240: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
7250: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
7260: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
7270: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
7280: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
7290: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
72a0: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
72b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
72c0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
72d0: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
72e0: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
72f0: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
7300: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
7310: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
7320: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
7330: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
7340: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
7350: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
7360: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
7370: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
7380: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
7390: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
73a0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
73b0: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
73c0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
73d0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
73e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
73f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7400: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
7410: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
7420: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
7430: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
7440: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
7450: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
7460: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
7470: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
7480: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
7490: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
74a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
74b0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
74c0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
74d0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
74e0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
74f0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
7500: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
7510: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
7520: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7530: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
7540: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
7550: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
7560: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
7570: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
7580: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
7590: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
75a0: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
75b0: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
75c0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
75d0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
75e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
75f0: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
7600: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
7610: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
7620: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
7630: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
7640: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7650: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
7660: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
7670: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7680: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
7690: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
76a0: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
76b0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
76c0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
76d0: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
76e0: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
76f0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
7700: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7710: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
7720: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
7730: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
7740: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
7750: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7770: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
7780: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
7790: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
77a0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
77b0: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
77c0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
77d0: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
77e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
77f0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
7800: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7810: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7830: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
7840: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
7850: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
7860: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7870: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
7880: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7890: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
78a0: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
78b0: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
78c0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
78d0: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
78e0: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
78f0: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7900: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7910: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7920: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
7930: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
7940: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
7950: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
7960: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
7970: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
7980: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7990: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
79a0: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
79b0: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
79c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
79d0: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
79e0: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
79f0: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7a00: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7a10: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7a20: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
7a30: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
7a40: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
7a50: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
7a60: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
7a70: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7a80: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7a90: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7aa0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7ab0: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7ac0: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7ad0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7ae0: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7af0: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7b00: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7b10: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7b20: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
7b30: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
7b40: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
7b50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
7b70: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
7b80: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7b90: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7ba0: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7bb0: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7bc0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7bd0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7bf0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7c00: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7c10: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
7c20: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7c30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
7c40: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
7c50: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
7c60: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
7c70: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
7c80: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7c90: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7ca0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7cb0: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7cc0: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7cd0: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7ce0: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7cf0: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
7d00: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
7d10: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
7d20: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
7d30: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
7d40: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
7d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
7d60: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
7d70: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
7d80: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
7e60: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
7e70: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
7e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7e90: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7ea0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7eb0: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7ec0: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7ed0: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7ee0: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7ef0: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
7f00: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
7f10: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
7f20: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
7f30: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
7f40: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
7f50: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
7f60: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
7f70: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
7f80: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7f90: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7fa0: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7fb0: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7fc0: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7fd0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7fe0: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7ff0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
8000: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
8010: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
8020: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
8030: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
8040: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
8050: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
8060: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
8070: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
8080: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
8090: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
80a0: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
80b0: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
80c0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
80d0: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
80e0: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
80f0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
8100: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
8110: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
8120: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
8130: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
8140: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
8150: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
8160: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
8170: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
8180: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
8190: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
81a0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
81b0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
81c0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
81d0: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
81e0: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
81f0: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
8200: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
8210: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
8220: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
8230: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
8240: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
8250: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
8260: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
8270: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
8280: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
8290: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
82a0: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
82b0: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
82c0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
82d0: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
82e0: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
82f0: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
8300: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
8310: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
8320: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
8330: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
8340: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
8350: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
8360: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
8370: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
8380: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
8390: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
83a0: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
83b0: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
83c0: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
83d0: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
83e0: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
83f0: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
8400: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
8410: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
8420: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
8430: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
8440: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
8450: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
8460: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
8470: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
8480: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
8490: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
84a0: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
84b0: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
84c0: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
84d0: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
84e0: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
84f0: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
8500: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
8510: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
8520: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
8530: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
8540: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
8550: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
8560: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
8570: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
8580: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
8590: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
85a0: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
85b0: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
85c0: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
85d0: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
85e0: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
85f0: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
8600: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
8610: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
8620: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
8630: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
8640: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
8650: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
8660: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
8670: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
8680: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
8690: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
86a0: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
86b0: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
86c0: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
86d0: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
86e0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
86f0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8700: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
8710: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
8720: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
8730: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
8740: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
8750: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8760: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
8770: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
8780: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
8790: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
87a0: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
87b0: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
87c0: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
87d0: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
87e0: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
87f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8800: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8810: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8820: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
8830: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
8840: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
8850: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
8860: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
8870: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
8880: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8890: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
88a0: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
88b0: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
88c0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
88d0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
88e0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
88f0: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8900: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8910: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8920: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
8930: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
8940: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
8950: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
8960: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
8970: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
8980: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8990: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
89a0: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
89b0: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
89c0: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
89d0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
89e0: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
89f0: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8a00: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8a10: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8a20: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
8a30: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
8a40: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
8a50: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
8a60: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
8a70: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
8a80: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8a90: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8aa0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8ab0: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8ac0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8ad0: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8ae0: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8af0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8b00: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8b10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8b20: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
8b30: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8b40: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
8b50: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
8b60: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
8b70: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
8b80: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8b90: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8ba0: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8bb0: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8bc0: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8bd0: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8be0: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8bf0: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8c00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8c10: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
8c20: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
8c30: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
8c40: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
8c50: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
8c60: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
8c70: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
8c80: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8c90: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8ca0: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8cb0: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8cc0: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8cd0: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8ce0: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8cf0: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
8d00: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
8d10: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
8d20: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
8d30: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
8d40: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
8d50: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
8d60: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
8d70: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
8d80: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8d90: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8da0: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8db0: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8dc0: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8dd0: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8de0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8df0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
8e00: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
8e10: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
8e20: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
8e30: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
8e40: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
8e50: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
8e60: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
8e70: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
8e80: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8e90: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8ea0: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8eb0: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8ec0: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8ed0: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8ee0: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8ef0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8f00: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
8f10: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
8f20: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
8f30: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
8f40: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
8f50: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
8f60: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
8f70: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
8f80: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8f90: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8fa0: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8fb0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8fc0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8fd0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8fe0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8ff0: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
9000: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
9010: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
9020: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
9030: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
9040: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
9050: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
9060: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
9070: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
9080: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
9090: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
90a0: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
90b0: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
90c0: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
90d0: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
90e0: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
90f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9100: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
9110: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
9120: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
9130: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9140: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
9150: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
9160: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
9170: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
9180: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
9190: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
91a0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
91b0: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
91e0: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
91f0: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
9200: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
9210: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
9220: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
9230: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  . */.#else.  /* 
9240: 57 65 20 61 72 65 20 74 6f 6c 64 20 74 68 61 74  We are told that
9250: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
9260: 66 20 41 6e 64 72 6f 69 64 20 63 6f 6e 74 61 69  f Android contai
9270: 6e 20 61 20 62 75 67 20 74 68 61 74 0a 20 20 2a  n a bug that.  *
9280: 2a 20 73 69 7a 65 73 20 69 6e 6f 5f 74 20 61 74  * sizes ino_t at
9290: 20 6f 6e 6c 79 20 33 32 2d 62 69 74 73 20 69 6e   only 32-bits in
92a0: 73 74 65 61 64 20 6f 66 20 36 34 2d 62 69 74 73  stead of 64-bits
92b0: 2e 20 28 53 65 65 0a 20 20 2a 2a 20 68 74 74 70  . (See.  ** http
92c0: 73 3a 2f 2f 61 6e 64 72 6f 69 64 2d 72 65 76 69  s://android-revi
92d0: 65 77 2e 67 6f 6f 67 6c 65 73 6f 75 72 63 65 2e  ew.googlesource.
92e0: 63 6f 6d 2f 23 2f 63 2f 31 31 35 33 35 31 2f 33  com/#/c/115351/3
92f0: 2f 64 69 73 74 2f 73 71 6c 69 74 65 33 2e 63 29  /dist/sqlite3.c)
9300: 0a 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  .  ** To work ar
9310: 6f 75 6e 64 20 74 68 69 73 2c 20 61 6c 77 61 79  ound this, alway
9320: 73 20 61 6c 6c 6f 63 61 74 65 20 36 34 2d 62 69  s allocate 64-bi
9330: 74 73 20 66 6f 72 20 74 68 65 20 69 6e 6f 64 65  ts for the inode
9340: 20 6e 75 6d 62 65 72 2e 20 20 0a 20 20 2a 2a 20   number.  .  ** 
9350: 4f 6e 20 73 6d 61 6c 6c 20 6d 61 63 68 69 6e 65  On small machine
9360: 73 20 74 68 61 74 20 6f 6e 6c 79 20 68 61 76 65  s that only have
9370: 20 33 32 2d 62 69 74 20 69 6e 6f 64 65 73 2c 20   32-bit inodes, 
9380: 74 68 69 73 20 77 61 73 74 65 73 20 34 20 62 79  this wastes 4 by
9390: 74 65 73 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  tes,.  ** but th
93a0: 61 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  at should not be
93b0: 20 61 20 62 69 67 20 64 65 61 6c 2e 20 2a 2f 0a   a big deal. */.
93c0: 20 20 2f 2a 20 57 41 53 3a 20 20 69 6e 6f 5f 74    /* WAS:  ino_t
93d0: 20 69 6e 6f 3b 20 20 20 2a 2f 0a 20 20 75 36 34   ino;   */.  u64
93e0: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
93f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65          /* Inode
9400: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69   number */.#endi
9410: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
9420: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
9430: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
9440: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
9450: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
9460: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
9470: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
9480: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
9490: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
94a0: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
94b0: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
94c0: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
94d0: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
94e0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
94f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
9500: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
9510: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
9520: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
9530: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
9540: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
9550: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
9560: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
9570: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
9580: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
9590: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
95a0: 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ruct unixInodeIn
95b0: 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  fo {.  struct un
95c0: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
95d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
95e0: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
95f0: 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20  t nShared;      
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9610: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
9620: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
9630: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9640: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
9650: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52    /* One of SHAR
9660: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
9670: 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20  D_LOCK etc. */. 
9680: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62   unsigned char b
9690: 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20  ProcessLock;    
96a0: 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65   /* An exclusive
96b0: 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73   process lock is
96c0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   held */.  int n
96d0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
96e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
96f0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
9700: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
9710: 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  re */.  unixShmN
9720: 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
9730: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
9740: 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
9750: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
9760: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
9770: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
9780: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9790: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
97a0: 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a  g file locks */.
97b0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
97c0: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
97d0: 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65    /* Unused file
97e0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20   descriptors to 
97f0: 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49  close */.  unixI
9800: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
9810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
9820: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
9830: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
9840: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9850: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
9860: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
9870: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
9880: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
9890: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
98a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
98b0: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
98c0: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
98d0: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
98e0: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ock */.#endif.#i
98f0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
9900: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9920: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
9930: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
9940: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
9950: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20  ATHNAME+2];  /* 
9960: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
9970: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
9980: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
9990: 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20  HARED_MAPPING.  
99a0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 53  sqlite3_int64 nS
99b0: 68 61 72 65 64 4d 61 70 70 69 6e 67 3b 20 20 20  haredMapping;   
99c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 70 70 65  /* Size of mappe
99d0: 64 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65  d region in byte
99e0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 53 68  s */.  void *pSh
99f0: 61 72 65 64 4d 61 70 70 69 6e 67 3b 20 20 20 20  aredMapping;    
9a00: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
9a10: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a   mapped region *
9a20: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
9a30: 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c  ** A lists of al
9a40: 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  l unixInodeInfo 
9a50: 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74  objects..*/.stat
9a60: 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ic unixInodeInfo
9a70: 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b   *inodeList = 0;
9a80: 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e 6f    /* All unixIno
9a90: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
9aa0: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
9ab0: 64 20 69 6e 74 20 6e 55 6e 75 73 65 64 46 64 20  d int nUnusedFd 
9ac0: 3d 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c  = 0;    /* Total
9ad0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
9ae0: 63 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f 2a 0a  criptors */../*.
9af0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9b00: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
9b10: 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f  orAtLine(), is o
9b20: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
9b30: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
9b40: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e   unixLogError().
9b50: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76  .**.** It is inv
9b60: 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72  oked after an er
9b70: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e  ror occurs in an
9b80: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64   OS function and
9b90: 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a   errno has been.
9ba0: 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20  ** set. It logs 
9bb0: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
9bc0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
9bd0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
9be0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
9bf0: 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70   errno and, if p
9c00: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
9c10: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
9c20: 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65  valent from stre
9c30: 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72  rror() or.** str
9c40: 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a  error_r()..**.**
9c50: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
9c60: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
9c70: 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  e macro should b
9c80: 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  e the error code
9c90: 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65   that.** will be
9ca0: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
9cb0: 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  ite (e.g. SQLITE
9cc0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53  _IOERR_DELETE, S
9cd0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e  QLITE_CANTOPEN).
9ce0: 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62   .** The two sub
9cf0: 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74  sequent argument
9d00: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
9d10: 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66  name of the OS f
9d20: 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  unction that.** 
9d30: 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e  failed (e.g. "un
9d40: 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61  link", "open") a
9d50: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
9d60: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
9d70: 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a  th,.** if any..*
9d80: 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f  /.#define unixLo
9d90: 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20  gError(a,b,c)   
9da0: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
9db0: 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e  Line(a,b,c,__LIN
9dc0: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
9dd0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9de0: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
9df0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9e00: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
9e10: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
9e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
9e30: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9e40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
9e50: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
9e60: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
9e70: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
9e80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
9e90: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
9ea0: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
9eb0: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
9ee0: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
9ef0: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
9f00: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20  .  char *zErr;  
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f20: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72     /* Message fr
9f30: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9f40: 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20   equivalent */. 
9f50: 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72   int iErrno = er
9f60: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
9f70: 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c   /* Saved syscal
9f80: 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a  l error number *
9f90: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
9fa0: 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73  is not a threads
9fb0: 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54  afe build (SQLIT
9fc0: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29  E_THREADSAFE==0)
9fd0: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20  , then use.  ** 
9fe0: 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66  the strerror() f
9ff0: 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  unction to obtai
a000: 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  n the human-read
a010: 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  able error messa
a020: 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  ge.  ** equivale
a030: 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68  nt to errno. Oth
a040: 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65  erwise, use stre
a050: 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a  rror_r()..  */ .
a060: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
a070: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
a080: 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52  (HAVE_STRERROR_R
a090: 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30  ).  char aErr[80
a0a0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72  ];.  memset(aErr
a0b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  , 0, sizeof(aErr
a0c0: 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72  ));.  zErr = aEr
a0d0: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45  r;..  /* If STRE
a0e0: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73  RROR_R_CHAR_P (s
a0f0: 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73  et by autoconf s
a100: 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45  cripts) or __USE
a110: 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c  _GNU is defined,
a120: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
a130: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
a140: 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76 65  vides the GNU ve
a150: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
a160: 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20  r_r() that.  ** 
a170: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
a180: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
a190: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72  ntaining the err
a1a0: 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74  or message. That
a1b0: 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d   pointer .  ** m
a1c0: 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72  ay point to aErr
a1d0: 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f  [], or it may po
a1e0: 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74  int to some stat
a1f0: 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77  ic storage somew
a200: 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  here. .  ** Othe
a210: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68  rwise, assume th
a220: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
a230: 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58  ovides the POSIX
a240: 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a   version of .  *
a250: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20  * strerror_r(), 
a260: 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69  which always wri
a270: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
a280: 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d  sage into aErr[]
a290: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
a2a0: 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63  he code incorrec
a2b0: 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74  tly assumes that
a2c0: 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58   it is the POSIX
a2d0: 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73   version that is
a2e0: 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c  .  ** available,
a2f0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
a300: 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65  ge will often be
a310: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
a320: 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67  . Not a.  ** hug
a330: 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72  e problem. Incor
a340: 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e  rectly concludin
a350: 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76  g that the GNU v
a360: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
a370: 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20  ble .  ** could 
a380: 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75  lead to a segfau
a390: 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a  lt though..  */.
a3a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45  #if defined(STRE
a3b0: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c  RROR_R_CHAR_P) |
a3c0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f  | defined(__USE_
a3d0: 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23  GNU).  zErr = .#
a3e0: 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f   endif.  strerro
a3f0: 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72  r_r(iErrno, aErr
a400: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31  , sizeof(aErr)-1
a410: 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45  );..#elif SQLITE
a420: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a  _THREADSAFE.  /*
a430: 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61   This is a threa
a440: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74  dsafe build, but
a450: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73   strerror_r() is
a460: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
a470: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a  */.  zErr = "";.
a480: 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74  #else.  /* Non-t
a490: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
a4a0: 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e   use strerror().
a4b0: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72   */.  zErr = str
a4c0: 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23  error(iErrno);.#
a4d0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61  endif..  if( zPa
a4e0: 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20  th==0 ) zPath = 
a4f0: 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  "";.  sqlite3_lo
a500: 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
a510: 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20   "os_unix.c:%d: 
a520: 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73  (%d) %s(%s) - %s
a530: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
a540: 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  iErrno, zFunc, z
a550: 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a  Path, zErr.  );.
a560: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
a570: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  e;.}../*.** Clos
a580: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
a590: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  tor..**.** We as
a5a0: 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28  sume that close(
a5b0: 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  ) almost always 
a5c0: 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20  works, since it 
a5d0: 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20  is only in a.** 
a5e0: 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63  very sick applic
a5f0: 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65  ation or on a ve
a600: 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d  ry sick platform
a610: 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66   that it might f
a620: 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  ail..** If it do
a630: 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20  es fail, simply 
a640: 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65  leak the file de
a650: 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f  scriptor, but do
a660: 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f   log the.** erro
a670: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  r..**.** Note th
a680: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  at it is not saf
a690: 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65  e to retry close
a6a0: 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73  () after EINTR s
a6b0: 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ince the.** file
a6c0: 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68   descriptor migh
a6d0: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
a6e0: 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e  een reused by an
a6f0: 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a  other thread..**
a700: 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65   So we don't eve
a710: 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72  n try to recover
a720: 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20   from an EINTR. 
a730: 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72   Just log the er
a740: 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20  ror.** and move 
a750: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
a760: 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  id robust_close(
a770: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
a780: 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65   int h, int line
a790: 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f  no){.  if( osClo
a7a0: 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69  se(h) ){.    uni
a7b0: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
a7c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
a7d0: 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20  SE, "close",.   
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c      pFile ? pFil
a800: 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69  e->zPath : 0, li
a810: 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  neno);.  }.}../*
a820: 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c  .** Set the pFil
a830: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44  e->lastErrno.  D
a840: 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72  o this in a subr
a850: 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74 20 70  outine as that p
a860: 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e  rovides.** a con
a870: 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
a880: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
a890: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
a8a0: 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f  d storeLastErrno
a8b0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a8c0: 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20  , int error){.  
a8d0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a8e0: 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   = error;.}../*.
a8f0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
a900: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
a910: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
a920: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
a930: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20  Unused list..*/ 
a940: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
a950: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69  sePendingFds(uni
a960: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a970: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a980: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
a990: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
a9a0: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
a9b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
a9c0: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
a9d0: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
a9e0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
a9f0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
aa00: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
aa10: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
aa20: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
aa30: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
aa40: 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20 20   nUnusedFd--;.  
aa50: 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  }.  pInode->pUnu
aa60: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
aa70: 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78  * Release a unix
aa80: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
aa90: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
aaa0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
aab0: 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a  InodeInfo()..**.
aac0: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
aad0: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
aae0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
aaf0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
ab00: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
ab10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ab20: 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
ab30: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f   void releaseIno
ab40: 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20  deInfo(unixFile 
ab50: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
ab60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
ab70: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
ab80: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
ab90: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
aba0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f   if( ALWAYS(pIno
abb0: 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  de) ){.    pInod
abc0: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
abd0: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
abe0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
abf0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
ac00: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 23 69 66 64 65  Node==0 );.#ifde
ac10: 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f  f SQLITE_SHARED_
ac20: 4d 41 50 50 49 4e 47 0a 20 20 20 20 20 20 69 66  MAPPING.      if
ac30: 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65  ( pInode->pShare
ac40: 64 4d 61 70 70 69 6e 67 20 29 7b 0a 20 20 20 20  dMapping ){.    
ac50: 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 49 6e      osMunmap(pIn
ac60: 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70  ode->pSharedMapp
ac70: 69 6e 67 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ing, pInode->nSh
ac80: 61 72 65 64 4d 61 70 70 69 6e 67 29 3b 0a 20 20  aredMapping);.  
ac90: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 53        pInode->pS
aca0: 68 61 72 65 64 4d 61 70 70 69 6e 67 20 3d 20 30  haredMapping = 0
acb0: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
acc0: 2d 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67  ->nSharedMapping
acd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
ace0: 6e 64 69 66 0a 20 20 20 20 20 20 63 6c 6f 73 65  ndif.      close
acf0: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
ad00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
ad10: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
ad20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ad30: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
ad40: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
ad50: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
ad60: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
ad70: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
ad80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ad90: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
ada0: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
adb0: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
adc0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
add0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ade0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
adf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ae00: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
ae10: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
ae20: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
ae30: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
ae40: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
ae50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ae60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
ae70: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
ae80: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
ae90: 69 73 74 21 3d 30 20 7c 7c 20 6e 55 6e 75 73 65  ist!=0 || nUnuse
aea0: 64 46 64 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  dFd==0 );.}../*.
aeb0: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
aec0: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
aed0: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
aee0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
aef0: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
af00: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
af10: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
af20: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
af30: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
af40: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
af50: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
af60: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
af70: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  rs..**.** The mu
af80: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
af90: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
afa0: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
afb0: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
afc0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
afd0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
afe0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
aff0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
b000: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
b010: 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  int findInodeInf
b020: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
b030: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
b040: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
b050: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
b060: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
b070: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
b080: 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20  fo **ppInode    
b090: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
b0a0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b0b0: 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29  object here */.)
b0c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c     /* System cal
b0f0: 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  l return code */
b100: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
b130: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69  scriptor for pFi
b140: 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  le */.  struct u
b150: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
b160: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
b170: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
b180: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20  xInodeInfo */.  
b190: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
b1a0: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
b1b0: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
b1c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
b1d0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
b1e0: 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20  *pInode = 0;    
b1f0: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
b200: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
b210: 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ct */..  assert(
b220: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
b230: 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f   );..  /* Get lo
b240: 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74  w-level informat
b250: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
b260: 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  le that we can u
b270: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61  sed to.  ** crea
b280: 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65  te a unique name
b290: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20   for the file.. 
b2a0: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65   */.  fd = pFile
b2b0: 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  ->h;.  rc = osFs
b2c0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
b2d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
b2e0: 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
b2f0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
b300: 6f 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  o);.#if defined(
b310: 45 4f 56 45 52 46 4c 4f 57 29 20 26 26 20 64 65  EOVERFLOW) && de
b320: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53  fined(SQLITE_DIS
b330: 41 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20 69 66  ABLE_LFS).    if
b340: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
b350: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
b360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
b370: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
b380: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
b390: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
b3a0: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
b3b0: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
b3c0: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
b3d0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
b3e0: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
b3f0: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
b400: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
b410: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
b420: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
b430: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
b440: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
b450: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
b460: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
b470: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
b480: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
b490: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
b4a0: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
b4b0: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
b4c0: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
b4d0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
b4e0: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
b4f0: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
b500: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
b510: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
b520: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
b530: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
b540: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
b550: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
b560: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
b570: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
b580: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
b590: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
b5a0: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
b5b0: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
b5c0: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
b5d0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
b5e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
b5f0: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
b600: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
b610: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
b620: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
b630: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
b640: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
b650: 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d   ){.    do{ rc =
b660: 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22   osWrite(fd, "S"
b670: 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  , 1); }while( rc
b680: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
b690: 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  TR );.    if( rc
b6a0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=1 ){.      sto
b6b0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
b6c0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
b6d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
b6e0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
b6f0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
b700: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
b710: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
b720: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
b730: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
b740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b750: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
b760: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
b770: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
b780: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
b790: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
b7a0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
b7b0: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
b7c0: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
b7d0: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
b7e0: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
b7f0: 3d 20 28 75 36 34 29 73 74 61 74 62 75 66 2e 73  = (u64)statbuf.s
b800: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
b810: 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73  assert( inodeLis
b820: 74 21 3d 30 20 7c 7c 20 6e 55 6e 75 73 65 64 46  t!=0 || nUnusedF
b830: 64 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 6f 64 65  d==0 );.  pInode
b840: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
b850: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
b860: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
b870: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
b880: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
b890: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
b8a0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
b8b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
b8c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
b8d0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
b8e0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
b8f0: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
b900: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
b910: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b920: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
b930: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
b940: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
b950: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
b960: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
b970: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
b980: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
b990: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
b9a0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
b9b0: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
b9c0: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
b9d0: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
b9e0: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
b9f0: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
ba00: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
ba10: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
ba20: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
ba30: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
ba40: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
ba50: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
ba60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ba70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ba80: 54 52 55 45 20 69 66 20 70 46 69 6c 65 20 68 61  TRUE if pFile ha
ba90: 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  s been renamed o
baa0: 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65  r unlinked since
bab0: 20 69 74 20 77 61 73 20 66 69 72 73 74 20 6f 70   it was first op
bac0: 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ened..*/.static 
bad0: 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  int fileHasMoved
bae0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
baf0: 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
bb00: 53 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  S.  return pFile
bb10: 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 20 70  ->pInode!=0 && p
bb20: 46 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65  File->pId!=pFile
bb30: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
bb40: 2e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74  .pId;.#else.  st
bb50: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
bb60: 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70   return pFile->p
bb70: 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20 20 20  Inode!=0 &&.    
bb80: 20 20 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d    (osStat(pFile-
bb90: 3e 7a 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30  >zPath, &buf)!=0
bba0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 75   .         || (u
bbb0: 36 34 29 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70  64)buf.st_ino!=p
bbc0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
bbd0: 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69  leId.ino);.#endi
bbe0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
bbf0: 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61  k a unixFile tha
bc00: 74 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e  t is a database.
bc10: 20 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c    Verify the fol
bc20: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31  lowing:.**.** (1
bc30: 29 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  ) There is exact
bc40: 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b  ly one hard link
bc50: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
bc60: 28 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20  (2) The file is 
bc70: 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  not a symbolic l
bc80: 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66  ink.** (3) The f
bc90: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
bca0: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
bcb0: 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65  nked.**.** Issue
bcc0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
bcd0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29  ITE_WARNING,...)
bce0: 20 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79   messages if any
bcf0: 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67  thing is not rig
bd00: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ht..*/.static vo
bd10: 69 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  id verifyDbFile(
bd20: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
bd30: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
bd40: 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  buf;.  int rc;..
bd50: 20 20 2f 2a 20 54 68 65 73 65 20 76 65 72 69 66    /* These verif
bd60: 69 63 61 74 69 6f 6e 73 20 6f 63 63 75 72 73 20  ications occurs 
bd70: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
bd80: 61 62 61 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  abase only */.  
bd90: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
bda0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
bdb0: 4e 4f 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 3b  NOLOCK ) return;
bdc0: 0a 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ..  rc = osFstat
bdd0: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
bde0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
bdf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
be00: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
be10: 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64   "cannot fstat d
be20: 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c  b file %s", pFil
be30: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
be40: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
be50: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30   buf.st_nlink==0
be60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
be70: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
be80: 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b  NG, "file unlink
be90: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
bea0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
beb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
bec0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
bed0: 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73  nlink>1 ){.    s
bee0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bef0: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74  E_WARNING, "mult
bf00: 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69  iple links to fi
bf10: 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  le: %s", pFile->
bf20: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
bf30: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  rn;.  }.  if( fi
bf40: 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
bf50: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
bf60: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
bf70: 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d  ING, "file renam
bf80: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
bf90: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
bfa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
bfb0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
bfc0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
bfd0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
bfe0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
bff0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
c000: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
c010: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
c020: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
c030: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
c040: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
c050: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
c060: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
c070: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
c080: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
c090: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
c0a0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
c0b0: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
c0c0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
c0d0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
c0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c0f0: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
c100: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
c110: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
c120: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
c130: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c140: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
c150: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
c160: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
c170: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
c180: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
c190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
c1a0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
c1b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
c1c0: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
c1d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c1e0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
c1f0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
c200: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
c210: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
c220: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
c230: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
c240: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
c250: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
c260: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
c270: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
c280: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
c290: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
c2a0: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
c2b0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
c2c0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
c2d0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
c2e0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
c2f0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
c300: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
c310: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
c320: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
c330: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
c340: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
c350: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
c360: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
c370: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c380: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
c390: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c3a0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
c3b0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
c3c0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
c3d0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
c3e0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
c3f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
c400: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
c410: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f  DLOCK;.      sto
c420: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
c430: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  e, errno);.    }
c440: 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c   else if( lock.l
c450: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
c460: 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  {.      reserved
c470: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
c480: 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78  #endif.  .  unix
c490: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
c4a0: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
c4b0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
c4c0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
c4d0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
c4e0: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
c4f0: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
c500: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c510: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
c520: 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20  t a system-lock 
c530: 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c  on the file pFil
c540: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
c550: 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79  .** described by
c560: 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66   pLock..**.** If
c570: 20 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f   the pFile was o
c580: 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65  pened read/write
c590: 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c   from unix-excl,
c5a0: 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c   then the only l
c5b0: 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61  ock.** ever obta
c5c0: 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75  ined is an exclu
c5d0: 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69  sive lock, and i
c5e0: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78  t is obtained ex
c5f0: 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68  actly once.** th
c600: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
c610: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
c620: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
c630: 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69  ent system locki
c640: 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  ng.** operations
c650: 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20   become no-ops. 
c660: 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   Locking operati
c670: 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e  ons still happen
c680: 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20   internally,.** 
c690: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72  in order to coor
c6a0: 64 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65  dinate access be
c6b0: 74 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64  tween separate d
c6c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c6d0: 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ons.** within th
c6e0: 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20  is process, but 
c6f0: 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68  all of that is h
c700: 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79  andled in memory
c710: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72   and the.** oper
c720: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65  ating system doe
c730: 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74  s not participat
c740: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
c750: 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73  nction is a pass
c760: 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74  -through to fcnt
c770: 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46  l(F_SETLK) if pF
c780: 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20  ile is using.** 
c790: 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68  any VFS other th
c7a0: 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f  an "unix-excl" o
c7b0: 72 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70  r if pFile is op
c7c0: 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78  ened on "unix-ex
c7d0: 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65  cl".** and is re
c7e0: 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a  ad-only..**.** Z
c7f0: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
c800: 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70  if the call comp
c810: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
c820: 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63  ly, or -1 if a c
c830: 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28  all.** to fcntl(
c840: 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  ) fails. In this
c850: 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20   case, errno is 
c860: 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c  set appropriatel
c870: 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a  y (by fcntl())..
c880: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c890: 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46  ixFileLock(unixF
c8a0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75  ile *pFile, stru
c8b0: 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29  ct flock *pLock)
c8c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
c8d0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
c8e0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
c8f0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
c900: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
c910: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
c920: 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  de!=0 );.  if( (
c930: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
c940: 20 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43   & (UNIXFILE_EXC
c950: 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  L|UNIXFILE_RDONL
c960: 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58  Y))==UNIXFILE_EX
c970: 43 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  CL ){.    if( pI
c980: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
c990: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
c9a0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
c9b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c9c0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
c9d0: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
c9e0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c9f0: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
ca00: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ca10: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
ca20: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
ca30: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
ca40: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
ca50: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
ca60: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ca70: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ca80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
ca90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
caa0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
cab0: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
cac0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
cad0: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
cae0: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
caf0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
cb00: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
cb10: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
cb20: 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72   pLock);.  }.  r
cb30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cb40: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
cb50: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
cb60: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
cb70: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
cb80: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
cb90: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
cba0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
cbb0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
cbc0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
cbd0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
cbe0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
cbf0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
cc00: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
cc10: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
cc20: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
cc30: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
cc40: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
cc50: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
cc60: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
cc70: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
cc80: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
cc90: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
cca0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
ccb0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
ccc0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
ccd0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
cce0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
ccf0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
cd00: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
cd10: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
cd20: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
cd30: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
cd40: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
cd50: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
cd60: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
cd70: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
cd80: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
cd90: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
cda0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
cdb0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
cdc0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
cdd0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
cde0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
cdf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ce00: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
ce10: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
ce20: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
ce30: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
ce40: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
ce50: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
ce60: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
ce70: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
ce80: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
ce90: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
cea0: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
ceb0: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
cec0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
ced0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
cee0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
cef0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
cf00: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
cf10: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
cf20: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
cf30: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
cf40: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
cf50: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
cf60: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
cf70: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
cf80: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
cf90: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
cfa0: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
cfb0: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
cfc0: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
cfd0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
cfe0: 20 77 69 74 68 20 57 69 6e 64 6f 77 73 39 35 20   with Windows95 
cff0: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
d000: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
d010: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
d020: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
d030: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
d040: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
d050: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
d060: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
d070: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
d080: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
d090: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
d0a0: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
d0b0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
d0c0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
d0d0: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
d0e0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
d0f0: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
d100: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
d110: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
d120: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
d130: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
d140: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
d150: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
d160: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
d170: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
d180: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
d190: 20 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61   'shared byte ra
d1a0: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
d1b0: 6b 65 64 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ked.  ** and the
d1c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
d1d0: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
d1e0: 61 73 65 64 2e 20 20 28 4c 65 67 61 63 79 20 6e  ased.  (Legacy n
d1f0: 6f 74 65 3a 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ote:  When.  ** 
d200: 53 51 4c 69 74 65 20 77 61 73 20 66 69 72 73 74  SQLite was first
d210: 20 64 65 76 65 6c 6f 70 65 64 2c 20 57 69 6e 64   developed, Wind
d220: 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20 77 65  ows95 systems we
d230: 72 65 20 73 74 69 6c 6c 20 76 65 72 79 20 63 6f  re still very co
d240: 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20 61 6e 64 20 57  mmon,.  ** and W
d250: 69 64 6e 6f 77 73 39 35 20 6c 61 63 6b 73 20 61  idnows95 lacks a
d260: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 63 61 70   shared-lock cap
d270: 61 62 69 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 20  ability.  So on 
d280: 57 69 6e 64 6f 77 73 39 35 2c 20 61 0a 20 20 2a  Windows95, a.  *
d290: 2a 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c  * single randoml
d2a0: 79 20 73 65 6c 65 63 74 65 64 20 62 79 20 66 72  y selected by fr
d2b0: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
d2c0: 79 74 65 20 72 61 6e 67 65 27 20 69 73 20 6c 6f  yte range' is lo
d2d0: 63 6b 65 64 2e 0a 20 20 2a 2a 20 57 69 6e 64 6f  cked..  ** Windo
d2e0: 77 73 39 35 20 69 73 20 6e 6f 77 20 70 72 65 74  ws95 is now pret
d2f0: 74 79 20 6d 75 63 68 20 65 78 74 69 6e 63 74 2c  ty much extinct,
d300: 20 62 75 74 20 74 68 69 73 20 77 6f 72 6b 2d 61   but this work-a
d310: 72 6f 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20  round for the.  
d320: 2a 2a 20 6c 61 63 6b 20 6f 66 20 73 68 61 72 65  ** lack of share
d330: 64 2d 6c 6f 63 6b 73 20 6f 6e 20 57 69 6e 64 6f  d-locks on Windo
d340: 77 73 39 35 20 6c 69 76 65 73 20 6f 6e 2c 20 66  ws95 lives on, f
d350: 6f 72 20 62 61 63 6b 77 61 72 64 73 0a 20 20 2a  or backwards.  *
d360: 2a 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  * compatibility.
d370: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72  ).  **.  ** A pr
d380: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
d390: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
d3a0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
d3b0: 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  as a SHARED lock
d3c0: 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45  ..  ** A RESERVE
d3d0: 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  D lock is implem
d3e0: 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e  ented by grabbin
d3f0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
d400: 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65  n the.  ** 'rese
d410: 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a  rved byte'. .  *
d420: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
d430: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
d440: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
d450: 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74  after it has obt
d460: 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41  ained a.  ** SHA
d470: 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44  RED lock. A PEND
d480: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  ING lock is impl
d490: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
d4a0: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
d4b0: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70  k.  ** on the 'p
d4c0: 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68  ending byte'. Th
d4d0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
d4e0: 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f  no new SHARED lo
d4f0: 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  cks can be.  ** 
d500: 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78  obtained, but ex
d510: 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f  isting SHARED lo
d520: 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  cks are allowed 
d530: 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72  to persist. A pr
d540: 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20  ocess.  ** does 
d550: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61  not have to obta
d560: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
d570: 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ck on the way to
d580: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
d590: 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65  .  ** This prope
d5a0: 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74  rty is used by t
d5b0: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72  he algorithm for
d5c0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
d5d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
d5e0: 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e  * after a crash.
d5f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58  .  **.  ** An EX
d600: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62  CLUSIVE lock, ob
d610: 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50  tained after a P
d620: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68  ENDING lock is h
d630: 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70  eld, is.  ** imp
d640: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
d650: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
d660: 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65  ck on the entire
d670: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
d680: 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65  ** range'. Since
d690: 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73   all other locks
d6a0: 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d   require a read-
d6b0: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
d6c0: 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69  he bytes.  ** wi
d6d0: 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c  thin this range,
d6e0: 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
d6f0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b  at no other lock
d700: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68  s are held on th
d710: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
d720: 20 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20   .  */.  int rc 
d730: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
d740: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d750: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d760: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d770: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
d780: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d790: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  int tErrno = 0;.
d7a0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
d7b0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
d7c0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
d7d0: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
d7e0: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
d7f0: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a  ile->h,.      az
d800: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
d810: 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
d820: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d830: 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  ),.      azFileL
d840: 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ock(pFile->pInod
d850: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
d860: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
d870: 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47  hared,.      osG
d880: 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
d890: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
d8a0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
d8b0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
d8c0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
d8d0: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
d8e0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
d8f0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
d900: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
d910: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
d920: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
d930: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
d940: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
d950: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
d960: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
d970: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
d980: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
d990: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
d9a0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
d9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
d9c0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
d9d0: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
d9e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d9f0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
da00: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
da10: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
da20: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
da30: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
da40: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
da50: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
da60: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
da70: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
da80: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
da90: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
daa0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
dab0: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
dac0: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
dad0: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
dae0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
daf0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
db00: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
db10: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
db20: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
db30: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
db40: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
db50: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
db60: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
db70: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
db80: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
db90: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
dba0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
dbb0: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
dbc0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
dbd0: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
dbe0: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
dbf0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
dc00: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
dc10: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
dc20: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
dc30: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
dc40: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
dc50: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
dc60: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
dc70: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
dc80: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
dc90: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
dca0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
dcb0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
dcc0: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
dcd0: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
dce0: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
dcf0: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
dd00: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
dd10: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
dd20: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
dd30: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
dd40: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
dd50: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
dd60: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
dd70: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
dd80: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
dd90: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
dda0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
ddb0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
ddc0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
ddd0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
dde0: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
ddf0: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
de00: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
de10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
de20: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
de30: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
de40: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
de50: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
de60: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
de70: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
de80: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
de90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
dea0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
deb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
dec0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
ded0: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
dee0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
def0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
df00: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
df10: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
df20: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
df30: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
df40: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
df50: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
df60: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
df70: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
df80: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
df90: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
dfa0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
dfb0: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
dfc0: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
dfd0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
dfe0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
dff0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
e000: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e010: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
e020: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
e030: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
e040: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
e050: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
e060: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
e070: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
e080: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
e090: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
e0a0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
e0b0: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
e0c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e0d0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
e0e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e0f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e100: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
e110: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e120: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e130: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e140: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e150: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
e160: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e170: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
e180: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
e190: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
e1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
e1b0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
e1c0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
e1d0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
e1e0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
e1f0: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
e200: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
e210: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
e220: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
e230: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
e240: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
e250: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
e260: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
e270: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e280: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
e290: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
e2a0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
e2b0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
e2c0: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
e2d0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
e2e0: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
e2f0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e300: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
e310: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
e320: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
e330: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e340: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
e350: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
e360: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
e370: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e380: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e390: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
e3a0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
e3b0: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
e3c0: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
e3d0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
e3e0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
e3f0: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
e400: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
e410: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e420: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
e430: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e440: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
e450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e460: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
e470: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
e480: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
e490: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
e4a0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
e4b0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
e4c0: 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20  NLOCK; .    }.. 
e4d0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e4e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e4f0: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
e500: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
e510: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
e520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
e530: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
e540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
e550: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
e560: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e570: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
e580: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
e590: 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
e5a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
e5b0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
e5c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
e5d0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
e5e0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
e5f0: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
e600: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
e610: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
e620: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
e630: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
e640: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
e650: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
e660: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
e670: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
e680: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
e690: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
e6a0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
e6b0: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
e6c0: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
e6d0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
e6e0: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
e6f0: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
e700: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
e710: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
e720: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
e730: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
e740: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
e750: 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73  _WRLCK;..    ass
e760: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
e770: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
e780: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
e790: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
e7a0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
e7b0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
e7c0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
e7d0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
e7e0: 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  BYTE;.      lock
e7f0: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
e800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
e810: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
e820: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
e830: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
e840: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ARED_SIZE;.    }
e850: 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ..    if( unixFi
e860: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e870: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
e880: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e890: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
e8a0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
e8b0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
e8c0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
e8d0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
e8e0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
e8f0: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
e900: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
e910: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e920: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20  .  }.  ..#ifdef 
e930: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
e940: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
e950: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
e960: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
e970: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
e980: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
e990: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
e9a0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
e9b0: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
e9c0: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
e9d0: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
e9e0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
e9f0: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
ea00: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
ea10: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
ea20: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
ea30: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
ea40: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
ea50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
ea60: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
ea70: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
ea80: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
ea90: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
eaa0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
eab0: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
eac0: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
ead0: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
eae0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
eaf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
eb00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
eb10: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
eb20: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
eb30: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
eb40: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
eb50: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
eb60: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
eb70: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
eb80: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
eb90: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
eba0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
ebb0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
ebc0: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
ebd0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
ebe0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
ebf0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
ec00: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
ec10: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
ec20: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
ec30: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
ec40: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
ec50: 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
ec60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
ec70: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
ec80: 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65  tor used by file
ec90: 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f   handle pFile to
eca0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
ecb0: 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69  ng.** pUnused li
ecc0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
ecd0: 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28  id setPendingFd(
ece0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
ecf0: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
ed00: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
ed10: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
ed20: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
ed30: 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
ed40: 74 65 64 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e  tedUnused;.  p->
ed50: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
ed60: 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64  pUnused;.  pInod
ed70: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a  e->pUnused = p;.
ed80: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
ed90: 0a 20 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c  .  pFile->pPreal
eda0: 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20  locatedUnused = 
edb0: 30 3b 0a 20 20 6e 55 6e 75 73 65 64 46 64 2b 2b  0;.  nUnusedFd++
edc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
edd0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
ede0: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
edf0: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
ee00: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
ee10: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
ee20: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
ee30: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
ee40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
ee50: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
ee60: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ee70: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
ee80: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
ee90: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
eea0: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
eeb0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
eec0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c  .** .** If handl
eed0: 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72  eNFSUnlock is tr
eee0: 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e  ue, then on down
eef0: 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  grading an EXCLU
ef00: 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41  SIVE_LOCK to SHA
ef10: 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20  RED.** the byte 
ef20: 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64  range is divided
ef30: 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e   into 2 parts an
ef40: 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  d the first part
ef50: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65   is unlocked the
ef60: 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65  n.** set to a re
ef70: 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ad lock, then th
ef80: 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20  e other part is 
ef90: 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  simply unlocked.
efa0: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a    This works .**
efb0: 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e   around a bug in
efc0: 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28   BSD NFS lockd (
efd0: 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63  also seen on Mac
efe0: 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20  OSX 10.3+) that 
eff0: 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d  fails to .** rem
f000: 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ove the write lo
f010: 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77  ck on a region w
f020: 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
f030: 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  is set..*/.stati
f040: 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63  c int posixUnloc
f050: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f060: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
f070: 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53  k, int handleNFS
f080: 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46  Unlock){.  unixF
f090: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
f0a0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
f0b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
f0c0: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
f0d0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
f0e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f0f0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
f100: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
f110: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
f120: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
f130: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
f140: 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
f150: 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k,.      pFile->
f160: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
f170: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
f180: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
f190: 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
f1a0: 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29     osGetpid(0)))
f1b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
f1c0: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
f1d0: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
f1e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
f1f0: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
f200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f210: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
f220: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
f230: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
f240: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
f250: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
f260: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
f270: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
f280: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
f290: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
f2a0: 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
f2b0: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69  eFileLock );..#i
f2c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
f2d0: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
f2e0: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
f2f0: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
f300: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
f310: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
f320: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f330: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
f340: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
f350: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
f360: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
f370: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
f380: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
f390: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
f3a0: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
f3b0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
f3c0: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
f3d0: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
f3e0: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
f3f0: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
f400: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
f410: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
f420: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
f430: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
f440: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
f450: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
f460: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
f470: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
f480: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
f490: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
f4a0: 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d     */.    pFile-
f4b0: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
f4c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
f4d0: 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74  /* downgrading t
f4e0: 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
f4f0: 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20  on NFS involves 
f500: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69  clearing the wri
f510: 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62  te lock.    ** b
f520: 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69  efore establishi
f530: 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20  ng the readlock 
f540: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63  - to avoid a rac
f550: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64  e condition we d
f560: 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20  owngrade.    ** 
f570: 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c  the lock in 2 bl
f580: 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61  ocks, so that pa
f590: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
f5a0: 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20  will be covered 
f5b0: 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69  by a .    ** wri
f5c0: 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  te lock until th
f5d0: 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65  e rest is covere
f5e0: 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b  d by a read lock
f5f0: 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b  :.    **  1:   [
f600: 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32  WWWWW].    **  2
f610: 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20  :   [....W].    
f620: 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d  **  3:   [RRRRW]
f630: 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52  .    **  4:   [R
f640: 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20  RRR.].    */.   
f650: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f660: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23  SHARED_LOCK ){.#
f670: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50  if !defined(__AP
f680: 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54  PLE__) || !SQLIT
f690: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f6a0: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f  _STYLE.      (vo
f6b0: 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  id)handleNFSUnlo
f6c0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
f6d0: 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
f6e0: 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23  k==0 );.#endif.#
f6f0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
f700: 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
f710: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f720: 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68  TYLE.      if( h
f730: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
f740: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
f750: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
f760: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
f770: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
f780: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ll errors */.   
f790: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
f7a0: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
f7b0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
f7c0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f7d0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f7e0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f7f0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f800: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f810: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f820: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f830: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
f840: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f850: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f860: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f870: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f880: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f890: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f8a0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f8b0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
f8c0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
f8d0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
f8e0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f8f0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f900: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f910: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
f920: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f930: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f940: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f950: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f960: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f970: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
f980: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f990: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f9a0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f9c0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f9d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f9e0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
f9f0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
fa00: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
fa10: 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
fa20: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
fa30: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
fa40: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
fa50: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
fa60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
fa70: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
fa80: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
fa90: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
faa0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
fab0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
fac0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
fad0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
fae0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
faf0: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
fb00: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
fb10: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
fb20: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
fb30: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
fb40: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
fb50: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
fb60: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
fb70: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
fb80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
fb90: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
fba0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
fbb0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
fbc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
fbd0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
fbe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
fbf0: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
fc00: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
fc10: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
fc20: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
fc30: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
fc40: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
fc50: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
fc60: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
fc70: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
fc80: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
fc90: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
fca0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
fcb0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
fcc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
fcd0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
fce0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
fcf0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
fd00: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
fd10: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
fd20: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
fd30: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
fd40: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
fd50: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
fd60: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
fd70: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
fd80: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
fd90: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
fda0: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
fdb0: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
fdc0: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
fdd0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
fde0: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
fdf0: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
fe00: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
fe10: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
fe20: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
fe30: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
fe40: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
fe50: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
fe60: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
fe70: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
fe80: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
fe90: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
fea0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
feb0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
fec0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
fed0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
fee0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
fef0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
ff00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ff10: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ff20: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
ff30: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ff40: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
ff50: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
ff60: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
ff70: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
ff80: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
ff90: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
ffa0: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
ffb0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
ffc0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
ffd0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
ffe0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
fff0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
10000 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
10010 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
10020 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
10030 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
10040 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74  rrno);.      got
10050 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
10060 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
10070 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
10080 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
10090 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
100a0 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
100b0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
100c0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
100d0 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
100e0 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
100f0 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
10100 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
10110 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
10120 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
10130 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
10140 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
10150 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
10160 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
10170 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
10180 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
10190 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
101a0 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
101b0 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
101c0 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
101d0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
101e0 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
101f0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
10200 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
10210 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10220 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10230 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10240 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
10250 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
10260 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49  rno);.        pI
10270 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
10280 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
10290 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
102a0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
102b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
102c0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
102d0 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
102e0 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
102f0 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
10300 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
10310 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
10320 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
10330 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
10340 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
10350 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
10360 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
10370 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
10380 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
10390 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
103a0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
103b0 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
103c0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
103d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
103e0 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
103f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65  e);.    }.  }..e
10400 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
10410 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
10420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10430 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
10440 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10450 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
10460 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
10470 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10480 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
10490 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
104a0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
104b0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
104c0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
104d0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
104e0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
104f0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
10500 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10510 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
10520 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
10530 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
10540 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
10550 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
10560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
10570 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
10580 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
10590 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51  ileLock){.#if SQ
105a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
105b0 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65  ZE>0.  assert( e
105c0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
105d0 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46  _LOCK || ((unixF
105e0 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63  ile *)id)->nFetc
105f0 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut==0 );.#endi
10600 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  f.  return posix
10610 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
10620 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Lock, 0);.}..#if
10630 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
10640 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
10650 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
10660 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
10670 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63  4 nByte);.static
10680 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
10690 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
106a0 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d);.#endif../*.*
106b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
106c0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
106d0 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
106e0 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
106f0 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
10700 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
10710 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
10720 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
10730 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
10740 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
10750 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
10760 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
10770 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
10780 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
10790 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
107a0 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
107b0 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
107c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
107d0 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
107e0 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
107f0 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
10800 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
10810 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
10820 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
10830 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
10840 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
10850 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
10860 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
10870 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10880 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53  xFile*)id;.#if S
10890 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
108a0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61  IZE>0.  unixUnma
108b0 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
108c0 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
108d0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
108e0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
108f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
10900 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
10910 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
10920 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
10930 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
10940 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
10950 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
10960 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
10970 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
10980 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
10990 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
109a0 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
109b0 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
109c0 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
109d0 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
109e0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
109f0 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
10a00 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69  _CLOSE.  if( pFi
10a10 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
10a20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
10a30 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  ){.    osUnlink(
10a40 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
10a50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10a60 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d  *(char**)&pFile-
10a70 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
10a80 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20  le->zPath = 0;. 
10a90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
10aa0 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
10ab0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
10ac0 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
10ad0 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
10ae0 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 50 72 65  free(pFile->pPre
10af0 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 29  allocatedUnused)
10b00 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
10b10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
10b20 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
10b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10b40 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
10b50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10b60 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74   unixClose(sqlit
10b70 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
10b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10b90 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
10ba0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10bb0 65 20 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79  e *)id;.  verify
10bc0 44 62 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20  DbFile(pFile);. 
10bd0 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20   unixUnlock(id, 
10be0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78  NO_LOCK);.  unix
10bf0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
10c00 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e   /* unixFile.pIn
10c10 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76 61  ode is always va
10c20 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77  lid here. Otherw
10c30 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74  ise, a different
10c40 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74   close.  ** rout
10c50 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b  ine (e.g. nolock
10c60 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62  Close()) would b
10c70 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
10c80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
10c90 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
10ca0 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65  nLock>0 || pFile
10cb0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
10cc0 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69  ssLock==0 );.  i
10cd0 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d  f( ALWAYS(pFile-
10ce0 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c  >pInode) && pFil
10cf0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
10d00 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
10d10 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
10d20 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
10d30 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
10d40 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
10d50 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
10d60 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
10d70 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
10d80 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
10d90 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
10da0 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
10db0 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  de->pUnused list
10dc0 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
10dd0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
10de0 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ed .    ** when 
10df0 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
10e00 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
10e10 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46  .    setPendingF
10e20 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  d(pFile);.  }.  
10e30 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
10e40 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20  (pFile);.  rc = 
10e50 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
10e60 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
10e70 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
10e80 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
10e90 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
10ea0 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
10eb0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
10ec0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
10ed0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f20 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f70 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f90 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63  ****** No-op Loc
10fa0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66  *******.**.** Of
10fd0 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
10fe0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
10ff0 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  ions available, 
11000 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20 74  this is by far t
11010 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20  he.** simplest: 
11020 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f   locking is igno
11030 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74  red.  No attempt
11040 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b   is made to lock
11050 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
11060 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
11070 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  g or writing..**
11080 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67  .** This locking
11090 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72   mode is appropr
110a0 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20  iate for use on 
110b0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
110c0 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61  ses.** (ex: data
110d0 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20 62  bases that are b
110e0 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f  urned into CD-RO
110f0 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29  M, for example.)
11100 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f    It can.** also
11110 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
11120 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c  application empl
11130 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61  oys some externa
11140 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a  l mechanism to.*
11150 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74  * prevent simult
11160 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66  aneous access of
11170 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
11180 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72  se by two or mor
11190 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
111a0 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20  nnections.  But 
111b0 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f  there is a serio
111c0 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62  us risk of datab
111d0 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  ase.** corruptio
111e0 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e  n if this lockin
111f0 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69  g mode is used i
11200 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65  n situations whe
11210 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64  re multiple.** d
11220 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11230 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 6e  ons are accessin
11240 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
11250 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
11260 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64  same.** time and
11270 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
11280 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
11290 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a  s are writing..*
112a0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  /..static int no
112b0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
112c0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
112d0 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
112e0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e   *pResOut){.  UN
112f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
11300 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73  otUsed);.  *pRes
11310 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Out = 0;.  retur
11320 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
11330 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
11340 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11350 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
11360 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
11370 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
11380 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
11390 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
113a0 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
113b0 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  int nolockUnlock
113c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
113d0 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
113e0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
113f0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
11400 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
11410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11420 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
11430 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  e the file..*/.s
11440 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
11450 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
11460 6c 65 20 2a 69 64 29 20 7b 0a 23 69 66 64 65 66  le *id) {.#ifdef
11470 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d   SQLITE_SHARED_M
11480 41 50 50 49 4e 47 0a 20 20 75 6e 69 78 46 69 6c  APPING.  unixFil
11490 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
114a0 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46  le*)id;.  if( pF
114b0 64 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20  d->pInode ){.   
114c0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
114d0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
114e0 6f 64 65 49 6e 66 6f 28 70 46 64 29 3b 0a 20 20  odeInfo(pFd);.  
114f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
11500 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ();.  }.#endif. 
11510 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
11520 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
11530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11540 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
11550 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
11560 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
115d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
11640 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11670 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
11680 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
11690 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
116a0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
116b0 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
116c0 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
116d0 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
116e0 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
116f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
11700 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
11710 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
11720 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
11730 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
11740 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
11750 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
11760 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
11770 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
11780 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
11790 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
117a0 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
117b0 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
117c0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
117d0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
117e0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
117f0 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
11800 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
11810 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
11820 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
11830 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
11840 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
11850 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
11860 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
11870 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
11880 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
11890 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
118a0 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
118b0 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
118c0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
118d0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
118e0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
118f0 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
11900 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
11910 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
11920 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
11930 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
11940 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
11950 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
11960 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
11970 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
11980 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
11990 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
119a0 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
119b0 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
119c0 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
119d0 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
119e0 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
119f0 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
11a00 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
11a10 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
11a20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
11a30 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
11a40 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11a50 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
11a60 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
11a70 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
11a80 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
11a90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11aa0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
11ab0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11ac0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11ad0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11ae0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11af0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11b00 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11b10 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11b20 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11b30 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11b40 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11b50 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
11b60 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11b70 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
11b80 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
11b90 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
11ba0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
11bb0 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
11bc0 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
11bd0 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
11be0 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
11bf0 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
11c00 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
11c10 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
11c20 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
11c30 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
11c40 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
11c50 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
11c60 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
11c70 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
11c80 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
11c90 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
11ca0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11cb0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11cc0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
11cd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11ce0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11cf0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11d00 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11d10 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
11d20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11d40 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11d50 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11d60 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11d70 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73  .  reserved = os
11d80 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20 63 68  Access((const ch
11d90 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
11da0 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30  ngContext, 0)==0
11db0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
11dc0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
11dd0 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22   %d (dotlock)\n"
11de0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
11df0 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70  reserved));.  *p
11e00 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
11e10 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
11e20 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
11e30 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
11e40 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
11e50 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
11e60 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
11e70 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
11e80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
11e90 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
11ea0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
11eb0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
11ec0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
11ed0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
11ee0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
11ef0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
11f00 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
11f10 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
11f20 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
11f30 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
11f40 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
11f50 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
11f60 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
11f70 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
11f80 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
11f90 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
11fa0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
11fb0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
11fc0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
11fd0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
11fe0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
11ff0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
12000 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12010 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12020 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
12030 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
12040 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
12050 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12060 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
12070 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
12080 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12090 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
120a0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
120b0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
120c0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
120d0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
120e0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
120f0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
12100 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
12110 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
12120 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
12130 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
12140 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64  el..**.** With d
12150 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
12160 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73  we really only s
12170 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29  upport state (4)
12180 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20  : EXCLUSIVE..** 
12190 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65  But we track the
121a0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c   other locking l
121b0 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79  evels internally
121c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
121d0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  dotlockLock(sqli
121e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
121f0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
12200 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12210 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12220 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
12230 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
12240 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12250 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
12260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
12270 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
12280 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
12290 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
122a0 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
122b0 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
122c0 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
122d0 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
122e0 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
122f0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
12300 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
12310 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20   NO_LOCK ){.    
12320 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12330 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12340 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
12350 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
12360 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
12370 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f   */.#ifdef HAVE_
12380 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28  UTIME.    utime(
12390 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
123a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d  ;.#else.    utim
123b0 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
123c0 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
123d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
123e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
123f0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
12400 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f  lock */.  rc = o
12410 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sMkdir(zLockFile
12420 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72  , 0777);.  if( r
12430 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  c<0 ){.    /* fa
12440 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
12450 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72  ate the lock dir
12460 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e  ectory */.    in
12470 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12480 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
12490 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
124a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
124b0 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
124c0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
124d0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
124e0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
124f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
12500 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
12510 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
12520 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
12530 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12540 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
12550 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
12560 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
12570 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
12580 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
12590 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
125a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
125b0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
125c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
125d0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
125e0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
125f0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
12600 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
12610 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
12620 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
12630 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12650 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
12660 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12670 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
12680 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
12690 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
126a0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
126b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
126c0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
126d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
126e0 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
126f0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12700 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
12710 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
12720 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12730 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
12740 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
12750 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12760 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
12770 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
12780 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
12790 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
127a0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
127b0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
127c0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
127d0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
127e0 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
127f0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
12800 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
12810 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12820 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
12830 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
12840 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
12850 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
12860 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
12870 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
12880 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
12890 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
128a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
128b0 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
128c0 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
128d0 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
128e0 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
128f0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
12900 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
12910 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
12920 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
12930 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
12940 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12950 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
12960 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
12970 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
12980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12990 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
129a0 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
129b0 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
129c0 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
129d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
129e0 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
129f0 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69  );.  rc = osRmdi
12a00 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  r(zLockFile);.  
12a10 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
12a20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12a30 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45 72 72  no;.    if( tErr
12a40 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no==ENOENT ){.  
12a50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12a60 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
12a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12a80 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
12a90 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12aa0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
12ab0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
12ac0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
12ad0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12ae0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
12af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12b00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
12b10 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
12b20 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
12b30 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
12b40 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
12b50 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
12b60 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
12b70 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  file *id) {.  un
12b80 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12b90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12ba0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
12bb0 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  ;.  dotlockUnloc
12bc0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
12bd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12be0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12bf0 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  text);.  return 
12c00 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
12c10 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
12c20 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
12c30 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  the dot-file loc
12c40 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12c50 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
12c60 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
12c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cb0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
12cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d00 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d20 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63   Begin flock Loc
12d30 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
12d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d50 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20  *****.**.** Use 
12d60 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74  the flock() syst
12d70 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69  em call to do fi
12d80 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  le locking..**.*
12d90 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  * flock() lockin
12da0 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69  g is like dot-fi
12db0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  le locking in th
12dc0 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  at the various.*
12dd0 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63  * fine-grain loc
12de0 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70  king levels supp
12df0 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  orted by SQLite 
12e00 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e  are collapsed in
12e10 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65  to.** a single e
12e20 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
12e30 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12e40 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
12e50 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47  , and.** PENDING
12e60 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73   locks are the s
12e70 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20  ame thing as an 
12e80 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
12e90 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c   SQLite.** still
12ea0 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20   works when you 
12eb0 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e  do this, but con
12ec0 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75  currency is redu
12ed0 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c  ced since.** onl
12ee0 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12ef0 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ss can be readin
12f00 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  g the database a
12f10 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  t a time..**.** 
12f20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f  Omit this sectio
12f30 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  n if SQLITE_ENAB
12f40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12f50 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a   is turned off.*
12f60 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
12f70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12f80 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  E../*.** Retry f
12f90 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
12fa0 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
12fb0 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
12fc0 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
12fd0 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
12fe0 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
12ff0 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
13000 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
13010 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
13020 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
13030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
13040 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
13050 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
13060 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
13070 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
13080 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
13090 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
130a0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
130b0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
130c0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
130d0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
130e0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
130f0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
13100 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
13110 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
13120 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
13130 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
13140 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
13150 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
13160 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
13170 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
13180 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
13190 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
131a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
131b0 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
131c0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
131d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
131e0 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
131f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13200 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
13210 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13220 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13230 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
13240 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13250 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
13260 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13270 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
13280 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
13290 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
132a0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
132b0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
132c0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
132d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
132e0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
132f0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13300 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
13310 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
13320 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13330 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
13340 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13350 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
13360 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
13370 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
13380 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
13390 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
133a0 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
133b0 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
133c0 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
133d0 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
133e0 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
133f0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13400 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
13410 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
13420 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
13430 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13440 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
13450 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
13460 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
13470 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
13480 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20  R_UNLOCK; .     
13490 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
134a0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
134b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
134c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
134d0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
134e0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
134f0 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
13500 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
13510 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
13520 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
13530 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
13540 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
13550 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
13560 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
13570 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
13580 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
13590 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
135a0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
135b0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
135c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
135d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
135e0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
135f0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
13600 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
13610 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
13620 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
13630 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13640 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13650 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13660 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45   0xff) == SQLITE
13670 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
13680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13690 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
136a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
136b0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
136c0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
136d0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
136e0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
136f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
13700 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
13710 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
13720 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
13730 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13740 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13750 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
13760 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
13770 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
13780 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
13790 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
137a0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
137b0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
137c0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
137d0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
137e0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
137f0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
13800 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
13810 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
13820 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13830 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13840 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13850 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
13860 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
13870 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
13880 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
13890 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
138a0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
138b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
138c0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
138d0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
138e0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
138f0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
13900 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
13910 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
13920 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13930 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13940 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13950 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13960 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
13970 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
13980 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13990 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
139a0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
139b0 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
139c0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
139d0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
139e0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
139f0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
13a00 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
13a10 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
13a20 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
13a30 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13a40 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13a50 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
13a60 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
13a70 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
13a80 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
13a90 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
13aa0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
13ab0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13ac0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
13ad0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
13ae0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
13af0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
13b00 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
13b10 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
13b20 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13b30 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13b40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13b50 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
13b60 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13b70 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
13b80 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
13b90 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
13ba0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
13bb0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
13bc0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
13bd0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
13be0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
13bf0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
13c00 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
13c10 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13c20 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13c30 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13c50 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
13c60 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13c70 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
13c80 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13c90 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
13ca0 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
13cb0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13cc0 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
13cd0 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
13ce0 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
13cf0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13d00 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13d10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13d20 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
13d30 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13d40 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
13d50 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13d60 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
13d70 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
13d80 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
13d90 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
13da0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
13db0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13dc0 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
13dd0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
13de0 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
13df0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
13e00 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
13e10 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
13e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13e30 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
13e40 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
13e50 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13e60 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
13e70 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53  (rc & 0xff) == S
13e80 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
13e90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13ea0 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
13eb0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
13ec0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13ed0 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
13ee0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
13ef0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
13f00 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
13f10 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
13f20 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
13f30 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
13f40 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
13f50 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
13f60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
13f70 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
13f80 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
13f90 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
13fa0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
13fb0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
13fc0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
13fd0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13fe0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
13ff0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
14000 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14010 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
14020 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14030 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14040 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
14050 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
14060 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
14070 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
14080 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
14090 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
140a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
140b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
140c0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
140d0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
140e0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
140f0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
14100 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
14110 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
14120 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
14130 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14150 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
14160 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
14170 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
14180 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
14190 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
141a0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
141b0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
141c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
141d0 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
141e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
141f0 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
14200 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
14210 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63   if( robust_floc
14220 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
14230 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53  _UN) ){.#ifdef S
14240 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
14250 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
14260 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14270 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _OK;.#endif /* S
14280 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
14290 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
142a0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
142b0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
142c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
142d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
142e0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
142f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
14310 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
14320 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
14330 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
14340 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73 65 72  e *id) {.  asser
14350 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c  t( id!=0 );.  fl
14360 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
14370 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e  _LOCK);.  return
14380 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
14390 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
143a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
143b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
143c0 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
143d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
143e0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
143f0 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
14400 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
14470 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144d0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
144e0 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
144f0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
14500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14510 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
14520 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
14530 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
14540 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
14550 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
14560 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
14570 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
14580 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
14590 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
145a0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
145b0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
145c0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
145d0 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
145e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
145f0 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
14600 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
14610 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
14620 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
14630 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
14640 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
14650 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
14660 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
14670 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
14680 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
14690 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
146a0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
146b0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
146c0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
146d0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
146e0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
146f0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
14700 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
14710 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
14720 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
14730 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
14740 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
14750 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
14760 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
14770 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14780 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
14790 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
147a0 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
147b0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
147c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
147d0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
147e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
147f0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
14800 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
14810 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14820 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
14830 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
14840 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14850 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
14860 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
14870 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
14880 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
14890 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
148a0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
148b0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
148c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
148d0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
148e0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
148f0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
14900 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
14910 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
14920 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
14930 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
14940 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
14950 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
14960 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73  pSem;..    if( s
14970 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
14980 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
14990 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
149a0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
149b0 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
149c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
149d0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
149e0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
149f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14a00 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
14a10 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
14a20 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
14a30 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65  rrno);.      } e
14a40 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
14a50 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
14a60 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
14a70 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
14a80 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
14a90 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
14aa0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
14ab0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
14ac0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14ad0 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
14ae0 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
14af0 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
14b00 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
14b10 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
14b20 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
14b30 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
14b40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
14b50 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
14b60 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
14b70 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
14b80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
14b90 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
14ba0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
14bb0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
14bc0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
14bd0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
14be0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
14bf0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
14c00 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
14c10 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
14c20 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
14c30 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
14c40 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
14c50 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
14c60 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
14c70 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
14c80 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
14c90 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
14ca0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
14cb0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
14cc0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
14cd0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
14ce0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
14cf0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
14d00 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
14d10 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
14d20 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
14d30 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
14d40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
14d50 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
14d60 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
14d70 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
14d80 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
14d90 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
14da0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
14db0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
14dc0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
14dd0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
14de0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14df0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
14e00 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
14e10 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14e20 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
14e30 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
14e40 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
14e50 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
14e60 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
14e70 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
14e80 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
14e90 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
14ea0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
14eb0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
14ec0 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
14ed0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
14ee0 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
14ef0 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
14f00 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
14f10 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
14f20 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
14f30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14f40 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
14f50 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
14f60 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
14f70 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
14f80 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
14f90 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
14fa0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f  tatic int semXLo
14fb0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14fc0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14fd0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14fe0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14ff0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
15000 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
15010 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
15020 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15030 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
15040 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
15050 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
15060 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
15070 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
15080 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
15090 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
150a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
150b0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
150c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
150d0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
150e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
150f0 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
15100 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
15110 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
15120 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
15130 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
15140 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
15150 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
15160 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
15170 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15180 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
15190 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
151a0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
151b0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
151c0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
151d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
151e0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
151f0 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
15200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15210 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
15220 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
15230 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
15240 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
15250 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
15260 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
15270 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
15280 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
15290 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
152a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
152b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
152c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
152d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
152e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
152f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
15300 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
15310 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28   int semXUnlock(
15320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15330 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
15340 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
15350 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15360 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
15370 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
15380 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
15390 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
153a0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
153b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
153c0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
153d0 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
153e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
153f0 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
15400 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15410 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
15420 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
15430 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
15440 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
15450 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
15460 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
15470 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
15480 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
15490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
154a0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
154b0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
154c0 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
154d0 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
154e0 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
154f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15500 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
15510 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
15520 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
15530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15540 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
15550 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
15560 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
15570 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
15580 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
15590 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
155a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
155b0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
155c0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
155d0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
155e0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
155f0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
15600 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
15610 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
15620 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
15630 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
15640 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15650 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
15660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15670 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
15680 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
15690 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71  int semXClose(sq
156a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
156b0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
156c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
156d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
156e0 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63  d;.    semXUnloc
156f0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
15700 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
15710 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
15720 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
15730 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
15740 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
15750 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
15760 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
15770 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
15780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15790 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
157a0 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
157b0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
157c0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
157d0 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
157e0 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
157f0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15800 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
15810 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
15820 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
15830 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
15840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15880 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158d0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
158e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158f0 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
15900 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
15930 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
15940 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
15950 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
15960 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
15970 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
15980 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
15990 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
159a0 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
159b0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
159c0 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
159d0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
159e0 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
159f0 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
15a00 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
15a10 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
15a20 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
15a30 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
15a40 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
15a50 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
15a60 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
15a70 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
15a80 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
15a90 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
15aa0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
15ab0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
15ac0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
15ad0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
15ae0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
15af0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
15b00 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
15b10 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15b20 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
15b30 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
15b40 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
15b50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15b60 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
15b70 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
15b80 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
15b90 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
15ba0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
15bb0 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
15bc0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
15bd0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15be0 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
15bf0 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
15c00 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
15c10 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
15c20 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
15c30 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
15c40 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
15c50 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
15c60 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
15c70 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
15c80 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
15c90 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
15ca0 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
15cb0 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
15ce0 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
15cf0 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
15d00 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
15d10 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
15d20 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
15d30 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
15d40 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
15d50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
15d60 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
15d70 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
15d80 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
15d90 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
15da0 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
15db0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
15dc0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
15dd0 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
15de0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
15df0 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
15e00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
15e10 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
15e20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
15e30 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
15e40 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
15e50 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
15e60 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
15e70 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
15e80 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
15e90 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
15ea0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
15eb0 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
15ec0 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
15ed0 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
15ee0 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
15ef0 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
15f00 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
15f10 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
15f20 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
15f30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
15f40 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
15f50 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
15f60 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
15f70 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
15f80 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
15f90 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
15fa0 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
15fb0 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
15fc0 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
15fd0 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
15fe0 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
15ff0 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
16000 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
16010 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
16020 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
16030 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
16040 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
16050 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
16060 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
16070 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
16080 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
16090 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
160a0 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
160b0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
160c0 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
160d0 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
160e0 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
160f0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
16100 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
16110 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
16120 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
16130 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
16140 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
16150 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
16160 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
16170 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
16180 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16190 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
161a0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
161b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
161c0 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
161d0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
161e0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
16210 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
16220 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
16230 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
16240 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
16250 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
16260 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
16270 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
16280 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
16290 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
162a0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
162b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
162c0 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
162d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
162e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
162f0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
16300 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
16310 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
16320 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
16330 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
16340 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
16350 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
16360 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
16370 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
16380 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
16390 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
163a0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
163b0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
163c0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
163d0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
163e0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
163f0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
16400 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
16410 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
16420 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
16430 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16440 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
16450 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
16460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
16470 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
16480 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16490 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
164a0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
164b0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
164c0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
164d0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
164e0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
164f0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
16500 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16510 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
16520 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
16530 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
16540 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
16550 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
16560 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
16570 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
16580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16590 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
165a0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
165b0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
165c0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
165d0 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
165e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
165f0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
16600 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
16610 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
16620 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
16630 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
16640 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
16650 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
16660 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
16670 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
16680 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
16690 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
166a0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
166b0 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
166c0 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
166d0 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
166e0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
166f0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16700 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16710 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
16720 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
16730 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
16740 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
16750 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
16760 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
16770 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
16780 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
16790 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
167a0 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
167b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
167c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
167d0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
167e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
167f0 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
16800 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
16810 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
16820 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
16830 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
16840 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
16850 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
16860 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
16870 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
16880 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
16890 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
168a0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
168b0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
168c0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
168d0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
168e0 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
168f0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
16900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16910 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
16920 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
16930 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
16940 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
16950 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
16960 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
16970 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
16980 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
16990 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
169a0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
169b0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
169c0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
169d0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
169e0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
169f0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
16a00 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
16a10 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
16a20 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
16a30 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
16a40 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
16a50 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
16a60 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
16a70 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
16a80 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
16a90 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
16aa0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
16ab0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
16ac0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
16ad0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
16ae0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
16af0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
16b00 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
16b10 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
16b20 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
16b30 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
16b40 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
16b50 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
16b60 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
16b70 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
16b80 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
16b90 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
16ba0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
16bb0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
16bc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16bd0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
16be0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
16bf0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
16c00 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
16c10 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
16c20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
16c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
16c40 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
16c50 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16c60 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
16c70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
16c80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16c90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16ca0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
16cb0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
16cc0 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
16cd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
16ce0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
16cf0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
16d00 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
16d10 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
16d20 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
16d30 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
16d40 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
16d50 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
16d60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
16d70 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16d80 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
16d90 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
16da0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
16db0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
16dc0 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
16dd0 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
16de0 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70  nShared , osGetp
16df0 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
16e00 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16e10 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16e20 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16e30 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
16e40 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
16e50 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
16e60 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
16e70 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
16e80 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
16e90 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
16ea0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16eb0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16ec0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16ed0 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16ee0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16ef0 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16f00 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16f10 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16f20 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16f30 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16f40 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
16f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16f60 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
16f70 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
16f80 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
16f90 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
16fa0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
16fb0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
16fc0 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16fd0 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16fe0 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16ff0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
17000 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
17010 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
17020 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
17030 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
17040 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
17050 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
17060 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
17070 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
17080 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
17090 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
170a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
170b0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
170c0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
170d0 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
170e0 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
170f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
17100 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17110 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
17120 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
17130 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
17140 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
17150 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
17160 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17170 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
17180 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
17190 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
171a0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
171b0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
171c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
171d0 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
171e0 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
171f0 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
17200 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
17210 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
17220 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
17230 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
17240 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
17250 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17260 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
17270 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
17280 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
17290 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
172a0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
172b0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
172c0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
172d0 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
172e0 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
172f0 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
17300 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
17310 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
17320 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
17330 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
17340 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
17350 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
17360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
17370 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
17380 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17390 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
173a0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
173b0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
173c0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
173d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
173e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
173f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17400 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
17410 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
17420 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
17430 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17440 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
17450 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17460 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
17470 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
17480 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
17490 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
174a0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
174b0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
174c0 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
174d0 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
174e0 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
174f0 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
17500 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
17510 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
17520 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
17530 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
17540 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
17550 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
17560 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
17570 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17580 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
17590 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
175a0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
175b0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
175c0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
175d0 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
175e0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
175f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17600 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
17610 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
17620 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
17630 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
17640 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
17650 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17660 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
17670 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
17680 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
17690 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
176a0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
176b0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
176c0 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
176d0 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
176e0 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
176f0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17700 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
17710 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
17720 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
17730 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
17740 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
17750 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
17760 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
17770 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
17780 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
17790 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
177a0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
177b0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
177c0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
177d0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
177e0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
177f0 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
17800 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
17810 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
17820 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
17830 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
17840 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
17850 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
17860 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17870 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
17880 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
17890 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
178a0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
178b0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
178c0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
178d0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
178e0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
178f0 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
17900 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17910 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
17920 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
17930 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
17940 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
17950 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
17960 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
17970 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17980 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17990 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
179a0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
179b0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
179c0 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
179d0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
179e0 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45  rno(pFile, lrc1E
179f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  rrno);.      rc 
17a00 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
17a10 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17a20 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
17a30 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
17a40 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
17a50 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
17a60 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17a70 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
17a80 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
17a90 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
17aa0 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
17ab0 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
17ac0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
17ad0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
17ae0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
17af0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
17b00 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
17b10 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
17b20 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17b30 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
17b40 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
17b50 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
17b60 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
17b70 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
17b80 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
17b90 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
17ba0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
17bb0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
17bc0 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
17bd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17be0 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
17bf0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
17c00 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
17c10 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
17c20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
17c30 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
17c40 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
17c50 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
17c60 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
17c70 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
17c80 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
17c90 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
17ca0 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
17cb0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
17cc0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
17cd0 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
17ce0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
17cf0 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
17d00 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
17d10 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
17d20 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
17d30 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
17d40 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17d50 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17d60 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17d70 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
17d80 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
17d90 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
17da0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
17db0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
17dc0 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
17dd0 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
17de0 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
17df0 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
17e00 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
17e10 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
17e20 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
17e30 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
17e40 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
17e50 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
17e60 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
17e70 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
17e80 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
17e90 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
17ea0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
17eb0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
17ec0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17ed0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17ee0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17ef0 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17f10 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17f20 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
17f30 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
17f40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17f50 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
17f60 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
17f70 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
17f80 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
17f90 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
17fa0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17fb0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
17fc0 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17ff0 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
18000 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
18010 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
18020 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18030 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18050 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
18060 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
18070 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
18080 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
18090 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
180a0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
180b0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
180c0 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
180d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
180e0 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
180f0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
18100 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
18110 28 66 61 69 6c 65 64 20 26 20 30 78 66 66 29 20  (failed & 0xff) 
18120 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
18130 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18150 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
18160 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
18170 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
18180 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
18190 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
181a0 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
181b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
181c0 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
181d0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
181e0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
181f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18200 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
18210 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
18220 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
18230 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18240 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
18250 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
18260 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
18270 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
18280 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
18290 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
182a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
182b0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
182c0 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
182d0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
182e0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
182f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
18300 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18310 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
18320 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
18330 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
18340 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
18350 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
18360 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
18370 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
18380 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
18390 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
183a0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
183b0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
183c0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
183d0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
183e0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
183f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
18400 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
18410 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
18420 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
18430 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18440 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18450 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18460 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
18470 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
18480 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
18490 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
184a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
184b0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
184c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
184d0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
184e0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
184f0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
18500 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
18510 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
18520 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
18530 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
18540 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
18550 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
18560 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
18570 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
18580 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
18590 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
185a0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
185b0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
185c0 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
185d0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
185e0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
185f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
18600 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
18610 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
18620 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
18630 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
18640 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
18650 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
18660 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
18670 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
18680 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
18690 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
186a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
186b0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
186c0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
186d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
186e0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
186f0 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
18700 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18710 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
18720 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
18730 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
18740 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
18750 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
18760 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18770 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
18780 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
18790 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
187a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
187b0 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
187c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
187d0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
187e0 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
187f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
18800 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
18810 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
18820 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
18830 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
18840 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
18850 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
18860 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
18870 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
18880 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
18890 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
188a0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
188b0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
188c0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
188d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
188e0 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
188f0 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
18900 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
18910 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
18920 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
18930 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
18940 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
18950 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
18960 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
18970 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
18980 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
18990 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
189a0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
189b0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
189c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
189d0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
189e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
189f0 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
18a00 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
18a10 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
18a20 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
18a30 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
18a40 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
18a50 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18a60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
18a70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18a80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18a90 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
18aa0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
18ab0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18ac0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
18ad0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
18ae0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
18af0 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
18b00 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
18b10 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
18b20 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
18b30 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
18b40 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
18b50 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
18b60 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
18b70 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
18b80 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
18b90 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18ba0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
18bb0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
18bc0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
18bd0 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
18be0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18bf0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18c00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
18c10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
18c20 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
18c30 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
18c40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18c50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
18c60 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
18c70 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
18c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18c90 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18ca0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
18cb0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
18cc0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
18cd0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
18ce0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18cf0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
18d00 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
18d10 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
18d20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
18d30 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
18d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18d50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18d60 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
18d70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
18d80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18d90 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
18da0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
18db0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
18dc0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
18dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
18de0 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
18df0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
18e00 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
18e10 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
18e20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
18e30 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
18e40 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
18e50 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
18e60 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
18e70 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
18e80 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
18e90 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
18ea0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
18eb0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
18ec0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
18ed0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
18ee0 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
18ef0 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
18f00 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
18f10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
18f20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18f30 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
18f40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
18f50 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
18f60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18f70 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
18f80 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
18f90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
18fa0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18fb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18fc0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
18fd0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
18fe0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
18ff0 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
19000 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
19010 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
19020 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
19030 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
19040 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
19050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19060 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
19070 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
19080 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
19090 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
190a0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
190b0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
190c0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
190d0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
190e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
190f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
19100 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19110 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
19120 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
19130 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
19140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
19150 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
19160 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
19170 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
19180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
19190 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
191a0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
191b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
191c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
191d0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
191e0 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
191f0 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
19200 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
19210 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
19220 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
19230 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
19240 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
19250 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
19260 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
19270 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
19280 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
19290 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
192a0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
192b0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
192c0 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
192d0 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
192e0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
192f0 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
19300 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
19310 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
19320 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
19330 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
19340 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
19350 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
19360 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
19370 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
19380 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
19390 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
193a0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
193b0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  gContext);.  rc 
193c0 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
193d0 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
193e0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
193f0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
19400 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
19410 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
19420 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19430 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
19440 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
19450 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
19460 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
19470 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
19480 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
19490 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
194a0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
194b0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
194c0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
194d0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
194e0 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
194f0 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
19500 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
19510 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
19520 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
19530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19540 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
19550 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
19560 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
19570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
19580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
195d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
19640 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
19650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
19670 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
19680 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
19690 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
196a0 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
196b0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
196c0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
196d0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
196e0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
196f0 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
19700 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
19710 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
19720 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
19730 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
19740 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
19750 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
19760 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
19770 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
19780 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
19790 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
197a0 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
197b0 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
197c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
197d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
197e0 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
197f0 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
19800 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
19810 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
19820 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
19830 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19840 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
19850 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
19860 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
19870 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
19880 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
19890 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
198a0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
198b0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
198c0 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
198d0 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
198e0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
198f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
19900 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
19910 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
19920 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
19930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19940 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19990 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
199a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
199f0 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
19a00 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
19a10 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
19a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a30 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
19a40 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
19a50 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
19a60 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
19a70 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
19a80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
19a90 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
19aa0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
19ab0 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
19ac0 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
19ad0 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
19ae0 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
19af0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
19b00 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
19b10 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
19b20 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
19b30 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
19b40 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
19b50 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
19b60 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
19b70 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
19b80 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
19b90 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
19ba0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
19bb0 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
19bc0 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
19bd0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19be0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
19bf0 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
19c00 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
19c10 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
19c20 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
19c30 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
19c40 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
19c50 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
19c60 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
19c70 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
19c80 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
19c90 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
19ca0 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
19cb0 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
19cc0 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e  E_PREAD.** in an
19cd0 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
19ce0 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
19cf0 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
19d00 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
19d10 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
19d20 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
19d30 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
19d40 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
19d50 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
19d60 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
19d70 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
19d80 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
19d90 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
19da0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
19db0 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
19dc0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
19dd0 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
19de0 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
19df0 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
19e00 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
19e10 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19e20 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
19e30 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
19e40 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
19e50 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
19e60 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
19e70 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
19e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
19e90 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69  >h>2 );.  do{.#i
19ea0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19eb0 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
19ec0 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
19ed0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
19ee0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
19ef0 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
19f00 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19f10 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
19f20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
19f30 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
19f40 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
19f50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19f60 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
19f70 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
19f80 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
19f90 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
19fa0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
19fb0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
19fc0 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  et = -1 );.    i
19fd0 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29  f( newOffset<0 )
19fe0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
19ff0 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1a000 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1a010 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a020 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
1a030 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
1a040 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
1a050 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
1a060 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1a070 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
1a080 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
1a090 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
1a0a0 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
1a0b0 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
1a0c0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1a0d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
1a0e0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
1a0f0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1a100 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
1a110 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
1a120 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
1a130 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
1a140 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
1a150 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
1a160 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
1a170 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1a180 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
1a190 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1a1a0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1a1b0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a1c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1a1d0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1a1e0 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1a1f0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1a200 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1a210 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1a220 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1a230 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1a240 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1a250 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1a260 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1a270 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1a280 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1a290 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1a2a0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1a2b0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1a2c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a2d0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1a2e0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1a2f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1a300 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1a310 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a320 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1a330 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1a340 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1a350 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1a360 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1a370 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1a380 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1a390 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1a3a0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1a3b0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1a3c0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1a3d0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1a3e0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1a3f0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1a400 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1a410 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50  ssert( pFile->pP
1a420 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
1a430 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1a440 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1a450 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1a460 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1a470 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1a480 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1a490 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1a4a0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1a4b0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1a4c0 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
1a4d0 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1a4e0 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1a4f0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1a500 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1a510 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1a520 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1a530 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1a540 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1a550 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1a560 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1a570 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1a580 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a590 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a5a0 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  ], amt);.      r
1a5b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a5c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a5d0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1a5e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1a5f0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1a600 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1a610 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1a620 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1a630 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1a640 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1a650 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1a660 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1a670 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1a680 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1a690 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
1a6a0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1a6b0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1a6c0 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
1a6d0 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
1a6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a6f0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
1a700 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
1a710 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1a720 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
1a730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a740 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1a750 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  e{.    storeLast
1a760 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1a770 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74     /* not a syst
1a780 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1a790 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
1a7a0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
1a7b0 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
1a7c0 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
1a7d0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
1a7e0 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
1a7f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a800 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1a810 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
1a820 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
1a830 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63  ek the file-desc
1a840 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73  riptor passed as
1a850 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1a860 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75  ent to.** absolu
1a870 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20  te offset iOff, 
1a880 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
1a890 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  write nBuf bytes
1a8a0 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a   of data from.**
1a8b0 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20   pBuf to it. If 
1a8c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1a8d0 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73   return -1 and s
1a8e0 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68  et *piErrno. Oth
1a8f0 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75  erwise, .** retu
1a900 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75  rn the actual nu
1a910 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1a920 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79  itten (which may
1a930 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a   be less than.**
1a940 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69   nBuf)..*/.stati
1a950 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1a960 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20  teFd(.  int fd, 
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1a990 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72  descriptor to wr
1a9a0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
1a9b0 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  iOff,           
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a9d0 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  ile offset to be
1a9e0 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
1a9f0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1aa00 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1aa10 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1aa20 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
1aa30 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  r to the file */
1aa40 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20  .  int nBuf,    
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
1aa70 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74  ffer pBuf in byt
1aa80 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45  es */.  int *piE
1aa90 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  rrno            
1aaa0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1aab0 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20  Error number if 
1aac0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1aad0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1ab00 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d  turned by system
1ab10 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   call */..  asse
1ab20 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26  rt( nBuf==(nBuf&
1ab30 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
1ab40 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20  sert( fd>2 );.  
1ab50 61 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21  assert( piErrno!
1ab60 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20  =0 );.  nBuf &= 
1ab70 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52  0x1ffff;.  TIMER
1ab80 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66  _START;..#if def
1ab90 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
1aba0 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1abb0 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75  osPwrite(fd, pBu
1abc0 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20  f, nBuf, iOff); 
1abd0 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1abe0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1abf0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1ac00 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
1ac10 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72   rc = (int)osPwr
1ac20 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20  ite64(fd, pBuf, 
1ac30 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69  nBuf, iOff);}whi
1ac40 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1ac50 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
1ac60 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1ac70 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c  Seek = lseek(fd,
1ac80 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29   iOff, SEEK_SET)
1ac90 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1aca0 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d  Error( iSeek = -
1acb0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65  1 );.    if( iSe
1acc0 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ek<0 ){.      rc
1acd0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65   = -1;.      bre
1ace0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1acf0 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70   = osWrite(fd, p
1ad00 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77  Buf, nBuf);.  }w
1ad10 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1ad20 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1ad30 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e  ndif..  TIMER_EN
1ad40 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  D;.  OSTRACE(("W
1ad50 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
1ad60 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66  %7lld %llu\n", f
1ad70 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d  d, rc, iOff, TIM
1ad80 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20  ER_ELAPSED));.. 
1ad90 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45   if( rc<0 ) *piE
1ada0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1adb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1adc0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
1add0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
1ade0 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
1adf0 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
1ae00 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
1ae10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1ae20 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1ae30 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
1ae40 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
1ae50 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1ae60 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1ae70 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
1ae80 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1ae90 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1aea0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1aeb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1aec0 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
1aed0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
1aee0 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
1aef0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1af00 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e  .  return seekAn
1af10 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20  dWriteFd(id->h, 
1af20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e  offset, pBuf, cn
1af30 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e  t, &id->lastErrn
1af40 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  o);.}.../*.** Wr
1af50 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
1af60 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
1af70 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1af80 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1af90 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
1afa0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
1afb0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1afc0 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
1afd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1afe0 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
1aff0 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
1b000 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
1b010 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
1b020 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1b030 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1b040 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
1b050 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1b060 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1b070 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1b080 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1b090 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1b0a0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1b0b0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1b0c0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1b0d0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1b0e0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1b0f0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1b100 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1b110 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1b120 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
1b130 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20  atedUnused==0.  
1b140 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1b150 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1b160 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1b170 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1b180 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1b190 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1b1a0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1b1b0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1b1c0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1b1d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1b1e0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1b1f0 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1b200 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1b210 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1b220 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1b230 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1b240 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1b250 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1b260 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1b270 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1b280 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1b290 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1b2a0 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1b2b0 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1b2c0 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1b2d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1b2e0 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1b2f0 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1b300 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1b310 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1b320 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1b330 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1b340 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1b350 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1b360 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1b370 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1b380 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b390 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1b3a0 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1b3b0 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1b3c0 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1b3d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b3e0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1b3f0 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1b400 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1b410 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1b420 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1b430 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1b440 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1b450 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1b460 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1b470 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1b480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1b490 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1b4a0 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ed(SQLITE_MMAP_R
1b4b0 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51 4c  EADWRITE) && SQL
1b4c0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1b4d0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1b4e0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1b4f0 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1b500 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1b510 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1b520 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1b530 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1b540 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1b550 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1b560 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b570 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1b580 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1b590 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1b5a0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b5b0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b5c0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b5d0 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1b5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b5f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b600 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1b610 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1b620 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1b630 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1b640 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1b650 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1b660 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1b670 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1b680 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1b690 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1b6a0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1b6b0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1b6c0 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69  }.#endif. .  whi
1b6d0 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65  le( (wrote = see
1b6e0 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1b6f0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1b700 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74  mt))<amt && wrot
1b710 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  e>0 ){.    amt -
1b720 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
1b730 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
1b740 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
1b750 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
1b760 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
1b770 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
1b780 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
1b790 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1b7a0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
1b7b0 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
1b7c0 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20  ( amt>wrote ){. 
1b7d0 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26     if( wrote<0 &
1b7e0 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  & pFile->lastErr
1b7f0 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20  no!=ENOSPC ){.  
1b800 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1b810 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
1b820 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
1b830 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b840 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
1b850 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  se{.      storeL
1b860 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1b870 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73  0); /* not a sys
1b880 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
1b890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b8a0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1b8b0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1b8c0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
1b8d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
1b8e0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1b8f0 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
1b900 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
1b910 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1b920 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
1b930 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
1b940 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
1b950 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
1b960 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
1b970 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
1b980 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
1b990 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
1b9a0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1b9b0 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
1b9c0 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
1b9d0 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
1b9e0 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
1b9f0 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
1ba00 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
1ba10 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
1ba20 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69  ck with the (sli
1ba30 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a  ghtly slower).**
1ba40 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75   fsync(). If you
1ba50 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20   know that your 
1ba60 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70  system does supp
1ba70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  ort fdatasync() 
1ba80 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68  correctly,.** th
1ba90 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c  en simply compil
1baa0 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79  e with -Dfdatasy
1bab0 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20  nc=fdatasync or 
1bac0 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  -DHAVE_FDATASYNC
1bad0 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1bae0 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21  (fdatasync) && !
1baf0 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23  HAVE_FDATASYNC.#
1bb00 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
1bb10 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
1bb20 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
1bb30 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
1bb40 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
1bb50 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1bb60 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
1bb70 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
1bb80 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
1bb90 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
1bba0 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
1bbb0 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
1bbc0 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
1bbd0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
1bbe0 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
1bbf0 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1bc00 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
1bc10 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1bc20 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
1bc30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
1bc40 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
1bc50 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
1bc60 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
1bc70 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
1bc80 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
1bc90 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
1bca0 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
1bcb0 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
1bcc0 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
1bcd0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
1bce0 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
1bcf0 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
1bd00 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
1bd10 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
1bd20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
1bd30 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
1bd40 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
1bd50 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
1bd60 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
1bd70 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
1bd80 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
1bd90 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
1bda0 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
1bdb0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
1bdc0 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
1bdd0 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
1bde0 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
1bdf0 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
1be00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1be10 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
1be20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1be30 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
1be40 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
1be50 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
1be60 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
1be70 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
1be80 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
1be90 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
1bea0 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
1beb0 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
1bec0 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
1bed0 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
1bee0 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
1bef0 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
1bf00 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
1bf10 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
1bf20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
1bf30 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
1bf40 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1bf50 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
1bf60 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
1bf70 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
1bf80 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
1bf90 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
1bfa0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
1bfb0 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
1bfc0 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
1bfd0 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
1bfe0 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1bff0 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
1c000 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
1c010 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
1c020 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
1c030 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
1c040 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
1c050 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
1c060 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
1c070 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
1c080 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
1c090 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
1c0a0 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
1c0b0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
1c0c0 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
1c0d0 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
1c0e0 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
1c0f0 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
1c100 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
1c110 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
1c120 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
1c130 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
1c140 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
1c150 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
1c160 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
1c170 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
1c180 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1c190 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
1c1a0 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
1c1b0 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
1c1c0 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
1c1d0 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
1c1e0 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
1c1f0 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
1c200 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
1c210 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
1c220 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
1c230 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
1c240 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
1c250 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1c260 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c270 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
1c280 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1c290 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1c2a0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1c2b0 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
1c2c0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
1c2d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1c2e0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
1c2f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c300 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1c310 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1c320 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
1c330 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
1c340 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
1c350 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
1c360 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
1c370 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
1c380 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1c390 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
1c3a0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1c3b0 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
1c3c0 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
1c3d0 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
1c3e0 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
1c3f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1c400 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
1c410 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
1c420 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
1c430 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1c440 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
1c450 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
1c460 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
1c470 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
1c480 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
1c490 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75  .  ** no-op.  Bu
1c4a0 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63  t go ahead and c
1c4b0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 76  all fstat() to v
1c4c0 61 6c 69 64 61 74 65 20 74 68 65 20 66 69 6c 65  alidate the file
1c4d0 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
1c4e0 20 61 73 20 77 65 20 6e 65 65 64 20 61 20 6d 65   as we need a me
1c4f0 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20  thod to provoke 
1c500 61 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67  a failure during
1c510 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65 20 74  .  ** coverate t
1c520 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66  esting..  */.#if
1c530 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c540 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  NC.  {.    struc
1c550 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
1c560 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
1c570 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69   &buf);.  }.#eli
1c580 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1c590 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1c5a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ){.    rc = osFc
1c5b0 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1c5c0 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
1c5d0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1c5e0 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1c5f0 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1c600 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1c610 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1c620 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1c630 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1c640 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1c650 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1c660 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1c670 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1c680 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1c690 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1c6a0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1c6b0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1c6c0 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1c6d0 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1c6e0 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1c6f0 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1c700 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1c710 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1c720 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1c730 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1c740 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1c750 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1c760 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1c770 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1c780 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1c790 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1c7a0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1c7b0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1c7c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1c7d0 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1c7e0 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1c7f0 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1c800 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1c810 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1c820 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1c830 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1c840 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1c850 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1c860 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1c870 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1c880 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1c890 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1c8a0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1c8b0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1c8c0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1c8d0 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1c8e0 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1c8f0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1c900 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1c910 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1c920 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1c930 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1c940 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1c950 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1c960 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1c970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c980 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1c990 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1c9a0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1c9b0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1c9c0 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1c9d0 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1c9e0 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1c9f0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1ca00 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1ca10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1ca20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1ca30 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1ca40 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1ca50 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1ca60 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ca70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1ca80 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1ca90 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1caa0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1cab0 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1cac0 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1cad0 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1cae0 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1caf0 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1cb00 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1cb10 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1cb20 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1cb30 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1cb40 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1cb50 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1cb60 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1cb70 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1cb80 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1cb90 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1cba0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cbb0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1cbc0 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1cbd0 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1cbe0 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1cbf0 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1cc00 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1cc10 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1cc20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1cc30 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1cc40 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1cc50 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1cc60 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1cc70 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1cc80 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1cc90 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1cca0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1ccb0 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1ccc0 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1ccd0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1cce0 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1ccf0 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1cd00 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1cd10 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1cd20 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1cd30 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1cd40 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1cd50 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1cd60 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1cd70 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1cd80 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1cd90 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1cda0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1cdb0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1cdc0 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1cdd0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1cde0 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1cdf0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1ce00 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1ce10 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1ce20 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1ce30 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1ce40 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1ce50 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1ce60 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1ce70 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1ce80 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1ce90 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1cea0 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d   ii>0 && zDirnam
1ceb0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1cec0 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1ced0 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1cee0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  ] = '\0';.  }els
1cef0 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e  e{.    if( zDirn
1cf00 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44  ame[0]!='/' ) zD
1cf10 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b  irname[0] = '.';
1cf20 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d  .    zDirname[1]
1cf30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d   = 0;.  }.  fd =
1cf40 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1cf50 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1cf60 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1cf70 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1cf80 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1cf90 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1cfa0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1cfb0 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1cfc0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1cfd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cfe0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1cff0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1d000 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1d010 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1d020 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1d030 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1d040 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1d050 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1d060 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1d070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1d080 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1d090 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1d0a0 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1d0b0 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1d0c0 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1d0d0 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1d0e0 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1d0f0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1d100 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1d110 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1d120 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1d130 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1d140 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1d150 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1d160 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1d170 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1d180 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1d190 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1d1a0 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1d1b0 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1d1c0 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1d1d0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1d1e0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1d1f0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d200 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1d210 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1d220 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1d230 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1d240 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1d250 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1d260 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1d270 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1d280 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1d290 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1d2a0 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1d2b0 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1d2c0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1d2d0 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1d2e0 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1d2f0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1d300 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1d310 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1d320 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1d330 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1d340 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1d350 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1d360 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1d370 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1d380 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1d390 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1d3a0 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1d3b0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1d3c0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1d3d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1d3e0 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1d3f0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1d400 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1d410 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1d420 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1d430 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1d440 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1d450 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1d460 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1d470 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1d480 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1d490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1d4a0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1d4b0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1d4c0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1d4d0 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1d4e0 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1d4f0 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
1d500 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1d510 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1d520 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
1d530 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
1d540 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
1d550 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
1d560 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
1d570 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
1d580 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
1d590 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
1d5a0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1d5b0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
1d5c0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1d5d0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1d5e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1d5f0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1d600 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1d610 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1d620 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1d630 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
1d640 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1d650 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
1d660 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
1d670 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
1d680 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
1d690 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
1d6a0 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
1d6b0 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
1d6c0 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
1d6d0 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
1d6e0 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
1d6f0 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
1d700 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
1d710 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
1d720 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
1d730 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
1d740 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
1d750 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
1d760 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1d770 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1d780 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
1d790 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
1d7a0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1d7b0 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
1d7c0 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
1d7d0 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
1d7e0 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1d7f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
1d810 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1d820 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1d830 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1d840 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1d850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d860 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1d870 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b  LITE_CANTOPEN );
1d880 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d890 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1d8a0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1d8b0 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1d8c0 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1d8d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d8e0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1d8f0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1d900 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1d910 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1d920 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1d930 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1d940 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1d950 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1d960 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1d970 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1d980 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1d990 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1d9a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1d9b0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1d9c0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1d9d0 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1d9e0 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1d9f0 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1da00 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1da10 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1da20 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1da30 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1da40 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1da50 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1da60 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1da70 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1da80 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1da90 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1daa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1dab0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1dac0 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1dad0 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1dae0 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1daf0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1db00 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1db10 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1db20 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1db30 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
1db40 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1db50 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1db60 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1db70 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1db80 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1db90 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1dba0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1dbb0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1dbc0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1dbd0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1dbe0 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1dbf0 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1dc00 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1dc10 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1dc20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1dc30 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1dc40 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1dc50 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1dc60 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1dc70 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1dc80 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1dc90 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1dca0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1dcb0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1dcc0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1dcd0 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1dce0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1dcf0 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1dd00 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1dd10 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1dd20 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1dd30 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1dd40 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1dd50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1dd60 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1dd70 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1dd80 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1dd90 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1dda0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1ddb0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1ddc0 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1ddd0 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1dde0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1ddf0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1de00 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1de10 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1de20 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1de30 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1de40 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1de50 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1de60 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1de70 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1de80 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1de90 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1dea0 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1deb0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1dec0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1ded0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1dee0 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1def0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1df00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1df10 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1df20 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1df30 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1df40 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1df50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1df60 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1df70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1df80 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1df90 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1dfa0 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1dfb0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1dfc0 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1dfd0 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1dfe0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1dff0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1e000 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1e010 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1e020 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1e030 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1e040 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1e050 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1e060 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1e070 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1e080 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1e090 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1e0a0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1e0b0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1e0c0 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1e0d0 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1e0e0 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1e0f0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1e100 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1e110 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1e120 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1e130 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1e140 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1e150 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1e160 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1e170 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1e180 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1e190 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1e1a0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1e1b0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1e1c0 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1e1d0 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1e1e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1e1f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e200 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1e210 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1e220 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1e230 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1e240 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1e250 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1e260 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1e270 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1e280 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1e290 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1e2a0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1e2b0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1e2c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1e2d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e2e0 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1e2f0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1e300 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1e310 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1e320 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1e330 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1e340 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1e350 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1e360 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1e370 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1e380 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1e390 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1e3a0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1e3b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1e3c0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1e3d0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1e3e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1e3f0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1e400 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e410 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1e420 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1e430 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1e440 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1e450 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1e460 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1e470 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1e480 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1e490 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1e4a0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1e4b0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1e4c0 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
1e4d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e4e0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  FSTAT;.    }..  
1e4f0 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1e500 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1e510 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1e520 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1e530 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1e540 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1e550 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1e560 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1e570 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1e580 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1e590 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1e5a0 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1e5b0 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1e5c0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1e5d0 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1e5e0 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1e5f0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1e600 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1e610 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1e620 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1e630 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1e640 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1e650 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1e660 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1e670 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1e680 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1e690 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1e6a0 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1e6b0 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1e6c0 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1e6d0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1e6e0 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1e6f0 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1e700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e710 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1e720 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1e730 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1e740 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1e750 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1e760 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1e770 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1e780 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1e790 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1e7a0 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1e7b0 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1e7c0 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1e7d0 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1e7e0 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1e7f0 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1e800 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1e810 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1e820 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1e830 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1e840 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1e850 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1e860 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1e870 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1e880 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1e890 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1e8a0 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1e8b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e8c0 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1e8d0 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1e8e0 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1e8f0 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1e900 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1e910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e920 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1e930 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1e940 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1e950 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1e960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e970 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1e980 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1e990 20 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73   iWrite = (buf.s
1e9a0 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c  t_size/nBlk)*nBl
1e9b0 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20  k + nBlk - 1;.  
1e9c0 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
1e9d0 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
1e9e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e9f0 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c   ((iWrite+1)%nBl
1ea00 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  k)==0 );.      f
1ea10 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57  or(/*no-op*/; iW
1ea20 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d  rite<nSize+nBlk-
1ea30 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20  1; iWrite+=nBlk 
1ea40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1ea50 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69  Write>=nSize ) i
1ea60 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20  Write = nSize - 
1ea70 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74  1;.        nWrit
1ea80 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1ea90 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1eaa0 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1eab0 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1eac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ead0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1eae0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1eaf0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1eb00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1eb10 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1eb20 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
1eb30 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
1eb40 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
1eb50 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
1eb60 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
1eb70 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1eb80 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1eb90 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1eba0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
1ebb0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1ebc0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  no);.        ret
1ebd0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1ebe0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1ebf0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1ec00 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1ec10 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1ec20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1ec30 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1ec40 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1ec50 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1ec60 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1ec70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1ec80 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1ec90 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
1eca0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
1ecb0 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
1ecc0 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
1ecd0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1ece0 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
1ecf0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1ed00 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
1ed10 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
1ed20 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
1ed30 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
1ed40 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
1ed50 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
1ed60 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
1ed70 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
1ed80 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1ed90 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1eda0 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1edb0 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1edc0 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1edd0 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1ede0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1edf0 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1ee00 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1ee10 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1ee20 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1ee30 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1ee40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
1ee50 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1ee60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1ee70 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
1ee80 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1ee90 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  uf);../*.** Info
1eea0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
1eeb0 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
1eec0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1eed0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1eee0 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1eef0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1ef00 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1ef10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1ef20 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1ef30 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
1ef40 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1ef50 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
1ef60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1ef70 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1ef80 5f 57 52 49 54 45 29 0a 20 20 20 20 63 61 73 65  _WRITE).    case
1ef90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 45   SQLITE_FCNTL_BE
1efa0 47 49 4e 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  GIN_ATOMIC_WRITE
1efb0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
1efc0 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
1efd0 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 53 54  ->h, F2FS_IOC_ST
1efe0 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ART_ATOMIC_WRITE
1eff0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f000 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc ? SQLITE_IOER
1f010 52 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43 20 3a  R_BEGIN_ATOMIC :
1f020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f030 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f040 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41  E_FCNTL_COMMIT_A
1f050 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20  TOMIC_WRITE: {. 
1f060 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
1f070 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Ioctl(pFile->h, 
1f080 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
1f090 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
1f0a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1f0b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
1f0c0 4d 4d 49 54 5f 41 54 4f 4d 49 43 20 3a 20 53 51  MMIT_ATOMIC : SQ
1f0d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f0e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f0f0 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  CNTL_ROLLBACK_AT
1f100 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20  OMIC_WRITE: {.  
1f110 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49      int rc = osI
1f120 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  octl(pFile->h, F
1f130 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f  2FS_IOC_ABORT_VO
1f140 4c 41 54 49 4c 45 5f 57 52 49 54 45 29 3b 0a 20  LATILE_WRITE);. 
1f150 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1f160 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 4f   SQLITE_IOERR_RO
1f170 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 20 3a 20  LLBACK_ATOMIC : 
1f180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f190 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
1f1a0 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45  ux__ && SQLITE_E
1f1b0 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
1f1c0 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20  IC_WRITE */..   
1f1d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f1e0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1f1f0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1f200 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1f210 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1f220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f230 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1f240 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45  ITE_FCNTL_LAST_E
1f250 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
1f260 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1f270 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1f280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f290 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f2a0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f2b0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
1f2c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
1f2d0 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
1f2e0 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1f2f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f300 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f310 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1f320 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
1f330 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
1f340 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1f350 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
1f360 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
1f370 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
1f380 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1f390 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1f3a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f3b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
1f3c0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f3d0 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
1f3e0 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1f3f0 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1f400 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
1f410 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1f420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f430 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f440 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1f450 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1f460 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  TE: {.      unix
1f470 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1f480 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  NIXFILE_PSOW, (i
1f490 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1f4a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f4b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f4c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
1f4d0 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
1f4e0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1f4f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f500 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
1f510 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
1f520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f530 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f540 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1f550 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1f560 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1f570 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1f580 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66  oc64( pFile->pVf
1f590 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
1f5a0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
1f5b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
1f5c0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
1f5d0 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1f5e0 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
1f5f0 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1f600 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1f610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1f620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f630 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f640 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
1f650 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
1f660 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
1f670 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
1f680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1f6a0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1f6b0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1f6c0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f6d0 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1f6e0 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1f6f0 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1f700 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1f710 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1f720 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1f730 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f740 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1f750 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1f760 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f770 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1f780 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ..      /* The v
1f790 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74  alue of newLimit
1f7a0 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c   may be eventual
1f7b0 6c 79 20 63 61 73 74 20 74 6f 20 28 73 69 7a 65  ly cast to (size
1f7c0 5f 74 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20  _t) and passed. 
1f7d0 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28       ** to mmap(
1f7e0 29 2e 20 52 65 73 74 72 69 63 74 20 69 74 73 20  ). Restrict its 
1f7f0 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69 66 20  value to 2GB if 
1f800 28 73 69 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20  (size_t) is not 
1f810 61 74 20 6c 65 61 73 74 20 61 0a 20 20 20 20 20  at least a.     
1f820 20 2a 2a 20 36 34 2d 62 69 74 20 74 79 70 65 2e   ** 64-bit type.
1f830 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 65   */.      if( ne
1f840 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69 7a 65  wLimit>0 && size
1f850 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a  of(size_t)<8 ){.
1f860 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74          newLimit
1f870 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26 20 30   = (newLimit & 0
1f880 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20 20 20  x7FFFFFFF);.    
1f890 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36 34    }..      *(i64
1f8a0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1f8b0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
1f8c0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1f8d0 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
1f8e0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1f8f0 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
1f900 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
1f910 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1f920 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
1f930 69 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  it;.#ifdef SQLIT
1f940 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47  E_SHARED_MAPPING
1f950 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1f960 6c 65 2d 3e 70 49 6e 6f 64 65 3d 3d 30 20 29 0a  le->pInode==0 ).
1f970 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
1f980 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
1f990 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1f9a0 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
1f9b0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
1f9c0 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69    rc = unixMapfi
1f9d0 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
1f9e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f9f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1fa00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
1fa10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1fa20 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
1fa30 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
1fa40 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
1fa50 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
1fa60 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
1fa70 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1fa80 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
1fa90 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
1faa0 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
1fab0 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
1fac0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fad0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1fae0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
1faf0 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
1fb00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1fb10 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1fb20 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
1fb30 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
1fb40 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
1fb50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fb60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
1fb70 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1fb80 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1fb90 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1fba0 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
1fbb0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c  LITE_FCNTL_SET_L
1fbc0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
1fbd0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1fbe0 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_GET_LOCKPROX
1fbf0 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72  YFILE: {.      r
1fc00 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43  eturn proxyFileC
1fc10 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72  ontrol(id,op,pAr
1fc20 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  g);.    }.#endif
1fc30 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1fc40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1fc50 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1fc60 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72  LE__) */.  }.  r
1fc70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
1fc80 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
1fc90 49 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  If pFd->sectorSi
1fca0 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  ze is non-zero w
1fcb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1fcc0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
1fcd0 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f  is a.** no-op. O
1fce0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 61  therwise, the va
1fcf0 6c 75 65 73 20 6f 66 20 70 46 64 2d 3e 73 65 63  lues of pFd->sec
1fd00 74 6f 72 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20  torSize and .** 
1fd10 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61  pFd->deviceChara
1fd20 63 74 65 72 69 73 74 69 63 73 20 61 72 65 20 73  cteristics are s
1fd30 65 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  et according to 
1fd40 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
1fd50 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
1fd60 69 63 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ics. .**.** Ther
1fd70 65 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  e are two versio
1fd80 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
1fd90 69 6f 6e 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58  ion. One for QNX
1fda0 20 61 6e 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c   and one for all
1fdb0 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d  .** other system
1fdc0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  s..*/.#ifndef __
1fdd0 51 4e 58 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20  QNXNTO__.static 
1fde0 76 6f 69 64 20 73 65 74 44 65 76 69 63 65 43 68  void setDeviceCh
1fdf0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 75 6e  aracteristics(un
1fe00 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
1fe10 61 73 73 65 72 74 28 20 70 46 64 2d 3e 64 65 76  assert( pFd->dev
1fe20 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1fe30 63 73 3d 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65  cs==0 || pFd->se
1fe40 63 74 6f 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20  ctorSize!=0 );. 
1fe50 20 69 66 28 20 70 46 64 2d 3e 73 65 63 74 6f 72   if( pFd->sector
1fe60 53 69 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64  Size==0 ){.#if d
1fe70 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
1fe80 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1fe90 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
1fea0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
1feb0 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
1fec0 75 33 32 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20  u32 f = 0;..    
1fed0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 73 75 70  /* Check for sup
1fee0 70 6f 72 74 20 66 6f 72 20 46 32 46 53 20 61 74  port for F2FS at
1fef0 6f 6d 69 63 20 62 61 74 63 68 20 77 72 69 74 65  omic batch write
1ff00 73 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  s. */.    res = 
1ff10 6f 73 49 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20  osIoctl(pFd->h, 
1ff20 46 32 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41  F2FS_IOC_GET_FEA
1ff30 54 55 52 45 53 2c 20 26 66 29 3b 0a 20 20 20 20  TURES, &f);.    
1ff40 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 66  if( res==0 && (f
1ff50 20 26 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f   & F2FS_FEATURE_
1ff60 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 29 7b  ATOMIC_WRITE) ){
1ff70 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69  .      pFd->devi
1ff80 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1ff90 73 20 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  s = SQLITE_IOCAP
1ffa0 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20  _BATCH_ATOMIC;. 
1ffb0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f     }.#endif /* _
1ffc0 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49  _linux__ && SQLI
1ffd0 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
1ffe0 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a  ATOMIC_WRITE */.
1fff0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
20000 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
20010 49 54 45 20 66 6c 61 67 20 69 66 20 72 65 71 75  ITE flag if requ
20020 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
20030 28 20 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73  ( pFd->ctrlFlags
20040 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57   & UNIXFILE_PSOW
20050 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64   ){.      pFd->d
20060 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20070 74 69 63 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  tics |= SQLITE_I
20080 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
20090 56 45 52 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a  VERWRITE;.    }.
200a0 0a 20 20 20 20 70 46 64 2d 3e 73 65 63 74 6f 72  .    pFd->sector
200b0 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
200c0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
200d0 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  E;.  }.}.#else.#
200e0 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
200f0 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
20100 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
20110 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  >.static void se
20120 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  tDeviceCharacter
20130 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20  istics(unixFile 
20140 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 28 20 70  *pFile){.  if( p
20150 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20160 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72   == 0 ){.    str
20170 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e  uct statvfs fsIn
20180 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20  fo;.       .    
20190 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20  /* Set defaults 
201a0 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65  for non-supporte
201b0 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f  d filesystems */
201c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
201d0 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
201e0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
201f0 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  IZE;.    pFile->
20200 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20210 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69  stics = 0;.    i
20220 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c  f( fstatvfs(pFil
20230 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  e->h, &fsInfo) =
20240 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72  = -1 ) {.      r
20250 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
20260 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  torSize;.    }..
20270 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
20280 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
20290 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20  e, "tmp") ) {.  
202a0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
202b0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
202c0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
202d0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
202e0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
202f0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20300 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20  P_ATOMIC4K |    
20310 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69     /* All ram fi
20320 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
20330 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
20340 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20350 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
20360 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
20370 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
20380 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
203c0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
203d0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
203e0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
203f0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
20400 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
20410 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
20450 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
20460 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
20470 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
20480 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66  f_basetype, "etf
20490 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
204a0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
204b0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
204c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
204d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
204e0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
204f0 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69   etfs cluster si
20500 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74  ze writes are at
20510 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
20520 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
20530 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
20540 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
20550 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  2) |.        SQL
20560 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
20570 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
20580 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
20590 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
205a0 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
205d0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
205e0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
205f0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
20600 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
20610 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
20620 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
20630 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
20660 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
20670 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
20680 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
20690 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
206a0 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20  pe, "qnx6") ){. 
206b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
206c0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
206d0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
206e0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
206f0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
20700 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20710 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20  AP_ATOMIC |     
20720 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
20730 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
20740 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
20750 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20760 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
20770 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
20780 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
20790 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
207d0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
207e0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
207f0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
20800 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
20810 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
20820 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20850 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
20860 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
20870 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
20880 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
20890 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22  basetype, "qnx4"
208a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
208b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
208c0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
208d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
208e0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
208f0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
20900 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
20910 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
20920 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
20930 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
20940 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
20950 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
20960 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
20970 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
20980 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
20990 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
209a0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
209b0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
209c0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
209d0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
20a00 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
20a10 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
20a20 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
20a30 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
20a40 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20  , "dos") ){.    
20a50 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
20a60 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
20a70 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
20a80 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
20a90 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
20aa0 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
20ab0 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
20ac0 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
20ad0 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
20ae0 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
20af0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
20b00 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
20b10 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
20b20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
20b30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
20b40 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
20b50 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
20b60 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
20b70 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20ba0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
20bb0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
20bc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20bd0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20be0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20bf0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
20c00 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20  IOCAP_ATOMIC512 
20c10 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73  |      /* blocks
20c20 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
20c30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20c40 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
20c50 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
20c60 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
20c70 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
20cb0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
20cc0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20       0;.    }.  
20cd0 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e  }.  /* Last chan
20ce0 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e  ce verification.
20cf0 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20    If the sector 
20d00 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c  size isn't a mul
20d10 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a  tiple of 512.  *
20d20 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20  * then it isn't 
20d30 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70  valid.*/.  if( p
20d40 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20d50 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20   % 512 != 0 ){. 
20d60 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
20d70 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
20d80 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
20d90 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
20da0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
20db0 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23  OR_SIZE;.  }.}.#
20dc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
20dd0 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
20de0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
20df0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
20e00 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
20e10 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
20e20 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
20e30 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
20e40 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
20e50 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
20e60 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
20e70 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
20e80 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
20e90 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
20ea0 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
20eb0 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
20ec0 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
20ed0 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
20ee0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
20ef0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
20f00 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
20f10 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
20f20 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
20f30 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
20f40 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
20f50 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
20f60 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
20f70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
20f80 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
20f90 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  pFd = (unixFile*
20fa0 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65  )id;.  setDevice
20fb0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
20fc0 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pFd);.  return p
20fd0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  Fd->sectorSize;.
20fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20ff0 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
21000 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
21010 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
21020 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75  his VFS is set u
21030 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  p to return SQLI
21040 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
21050 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20  FE_OVERWRITE by 
21060 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65  default..** Howe
21070 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65  ver, that choice
21080 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61   is controversia
21090 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61  l since technica
210a0 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69  lly the underlyi
210b0 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  ng.** file syste
210c0 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79  m does not alway
210d0 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73  s provide powers
210e0 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20  afe overwrites. 
210f0 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f   (In other.** wo
21100 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77  rds, after a pow
21110 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70  er-loss event, p
21120 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65  arts of the file
21130 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72   that were never
21140 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68  .** written migh
21150 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61  t end up being a
21160 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65  ltered.)  Howeve
21170 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61  r, non-PSOW beha
21180 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a  vior is very,.**
21190 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64   very rare.  And
211a0 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20   asserting PSOW 
211b0 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65  makes a large re
211c0 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61  duction in the a
211d0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75  mount.** of requ
211e0 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75  ired I/O for jou
211f0 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61  rnaling, since a
21200 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20   lot of padding 
21210 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a  is eliminated..*
21220 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20  *  Hence, while 
21230 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
21240 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ITE is on by def
21250 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61  ault, there is a
21260 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a   file-control.**
21270 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
21280 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52  rn it off and UR
21290 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  I query paramete
212a0 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  r available to t
212b0 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73  urn it off..*/.s
212c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
212d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
212e0 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
212f0 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
21300 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
21310 6c 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76  le*)id;.  setDev
21320 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21330 63 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72  cs(pFd);.  retur
21340 6e 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61  n pFd->deviceCha
21350 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 7d 0a  racteristics;.}.
21360 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
21370 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
21380 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
21390 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20  P_SIZE>0../*.** 
213a0 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74 65  Return the syste
213b0 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  m page size..**.
213c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
213d0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
213e0 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62  alled directly b
213f0 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20  y other code in 
21400 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49  this file. .** I
21410 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c  nstead, it shoul
21420 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20  d be called via 
21430 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73  macro osGetpages
21440 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ize()..*/.static
21450 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65   int unixGetpage
21460 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20  size(void){.#if 
21470 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
21480 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20  urn 1024;.#elif 
21490 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55  defined(_BSD_SOU
214a0 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65  RCE).  return ge
214b0 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c  tpagesize();.#el
214c0 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  se.  return (int
214d0 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47  )sysconf(_SC_PAG
214e0 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d  ESIZE);.#endif.}
214f0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
21500 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21510 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
21520 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
21530 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
21540 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
21550 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
21560 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73  o represent an s
21570 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66  hared memory buf
21580 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  fer.  .**.** Whe
21590 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
215a0 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
215b0 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e   the same wal-in
215c0 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64  dex, each thread
215d0 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20  .** has its own 
215e0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20  unixShm object, 
215f0 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69  but they all poi
21600 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
21610 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
21620 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
21630 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
21640 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c   words, each wal
21650 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64  -index is opened
21660 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  .** only once pe
21670 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
21680 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64   Each unixShmNod
21690 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e  e object is conn
216a0 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c  ected to a singl
216b0 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
216c0 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f  object..** We co
216d0 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69  uld coalesce thi
216e0 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e  s object into un
216f0 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74  ixInodeInfo, but
21700 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e   that would mean
21710 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66  .** every open f
21720 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ile that does no
21730 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d  t use shared mem
21740 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ory (in other wo
21750 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65  rds, most.** ope
21760 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68  n files) would h
21770 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f  ave to carry aro
21780 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69  und this extra i
21790 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a  nformation.  So.
217a0 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** the unixInode
217b0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74  Info object cont
217c0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
217d0 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  o this unixShmNo
217e0 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64  de object.** and
217f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
21800 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
21810 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65  ed only when nee
21820 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d  ded..**.** unixM
21830 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
21840 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
21850 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
21860 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
21870 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
21880 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
21890 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
218a0 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
218b0 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nRef.**.** The f
218c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
218d0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
218e0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
218f0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
21900 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
21910 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
21920 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68  ** Either unixSh
21930 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74  mNode.mutex must
21940 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78   be held or unix
21950 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
21960 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  and.** unixMutex
21970 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
21980 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
21990 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
219a0 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
219b0 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  s structure..*/.
219c0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
219d0 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  de {.  unixInode
219e0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
219f0 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e    /* unixInodeIn
21a00 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69  fo that owns thi
21a10 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20  s SHM node */.  
21a20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
21a30 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
21a40 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
21a50 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
21a60 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
21a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21a80 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64  e of the mmapped
21a90 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68   file */.  int h
21aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21ab0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
21ac0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
21ad0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21af0 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
21b00 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
21b10 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b  /.  u16 nRegion;
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b30 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
21b40 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38  apRegion */.  u8
21b50 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20   isReadonly;    
21b60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21b70 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f   if read-only */
21b80 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69  .  char **apRegi
21b90 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
21ba0 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64   Array of mapped
21bb0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
21bc0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
21bd0 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
21be0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21bf0 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
21c00 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
21c10 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
21c20 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
21c30 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
21c40 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
21c50 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
21c60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21c70 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
21c80 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
21c90 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
21ca0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
21cb0 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
21cc0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
21cd0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
21ce0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
21cf0 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21d10 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
21d20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
21d30 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
21d40 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
21d50 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
21d60 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
21d70 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
21d80 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
21d90 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
21da0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
21db0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
21dc0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
21dd0 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
21de0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
21df0 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
21e00 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
21e10 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
21e20 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
21e30 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
21e40 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
21e50 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
21e60 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
21e70 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
21e80 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
21e90 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
21ea0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
21eb0 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
21ec0 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
21ed0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
21ee0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
21ef0 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
21f00 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
21f10 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
21f20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
21f30 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
21f40 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
21f50 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f70 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
21f80 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
21f90 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20  e mutex */.  u8 
21fa0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
21fb0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
21fc0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
21fd0 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78   within its unix
21fe0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36  ShmNode */.  u16
21ff0 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
22000 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
22010 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
22020 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
22030 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
22040 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22050 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
22060 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  held */.};../*.*
22070 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
22080 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
22090 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
220a0 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
220b0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
220c0 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  )         /* fir
220d0 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
220e0 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
220f0 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48  _DMS    (UNIX_SH
22100 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
22110 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
22120 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
22130 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69  /*.** Apply posi
22140 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x advisory locks
22150 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66   for all bytes f
22160 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68  rom ofst through
22170 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a   ofst+n-1..**.**
22180 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20   Locks block if 
22190 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63  the mask is exac
221a0 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61  tly UNIX_SHM_C a
221b0 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b  nd are non-block
221c0 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ing.** otherwise
221d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
221e0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
221f0 6b 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  k(.  unixFile *p
22200 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f  File,       /* O
22210 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  pen connection t
22220 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a  o the WAL file *
22230 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
22240 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
22250 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
22260 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
22270 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
22280 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22290 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
222a0 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
222b0 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
222c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
222d0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
222e0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
222f0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
22300 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
22310 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
22320 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
22330 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  t */.  struct fl
22340 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a  ock f;        /*
22350 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   The posix advis
22360 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ory locking stru
22370 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72  cture */.  int r
22380 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
22390 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
223a0 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
223b0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
223c0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
223d0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
223e0 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
223f0 6c 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64  ler */.  pShmNod
22400 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
22410 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
22420 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22430 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
22440 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53  de->mutex) || pS
22450 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
22460 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20  );..  /* Shared 
22470 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e  locks never span
22480 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
22490 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  yte */.  assert(
224a0 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70   n==1 || lockTyp
224b0 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20  e!=F_RDLCK );.. 
224c0 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69   /* Locks are wi
224d0 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  thin range */.  
224e0 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20  assert( n>=1 && 
224f0 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
22500 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
22510 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
22520 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
22530 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
22540 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
22550 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
22560 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
22570 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
22580 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
22590 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
225a0 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
225b0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
225c0 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
225d0 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
225e0 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
225f0 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
22600 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
22610 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
22620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
22630 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
22640 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
22650 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
22660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
22670 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
22680 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
22690 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
226a0 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30  sk = ofst>31 ? 0
226b0 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73  xffff : (1<<(ofs
226c0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
226d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
226e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
226f0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
22700 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
22710 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
22720 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
22730 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
22740 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
22750 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
22760 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
22770 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  mask;.    }else 
22780 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
22790 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
227a0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
227b0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
227c0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
227d0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
227e0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
227f0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
22800 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65   |= mask;.    }e
22810 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
22820 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
22830 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
22840 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
22850 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
22860 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
22870 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  e->exclMask |= m
22880 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
22890 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
228a0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a  &= ~mask;.    }.
228b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
228c0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
228d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
228e0 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
228f0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
22900 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
22910 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
22920 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
22930 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61  E(("read-lock fa
22940 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
22950 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
22960 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
22970 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
22980 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
22990 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
229a0 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
229b0 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61    OSTRACE((" - a
229c0 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25  fterwards %03x,%
229d0 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
229e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
229f0 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64  redMask, pShmNod
22a00 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  e->exclMask));. 
22a10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
22a20 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
22a30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22a40 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62  the minimum numb
22a50 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72  er of 32KB shm r
22a60 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75  egions that shou
22a70 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a  ld be mapped at.
22a80 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d  ** a time, assum
22a90 69 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d 61  ing that each ma
22aa0 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e  pping must be an
22ab0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
22ac0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  e of the.** curr
22ad0 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d  ent system page-
22ae0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61  size..**.** Usua
22af0 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20  lly, this is 1. 
22b00 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65  The exception se
22b10 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d  ems to be system
22b20 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69  s that are confi
22b30 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20  gured.** to use 
22b40 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20  64KB pages - in 
22b50 74 68 69 73 20 63 61 73 65 20 65 61 63 68 20 6d  this case each m
22b60 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65  apping must cove
22b70 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a  r at least two.*
22b80 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a  * shm regions..*
22b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22ba0 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70  xShmRegionPerMap
22bb0 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68  (void){.  int sh
22bc0 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20  msz = 32*1024;  
22bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d            /* SHM
22be0 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a   region size */.
22bf0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47    int pgsz = osG
22c00 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20  etpagesize();   
22c10 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20 73  /* System page s
22c20 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ize */.  assert(
22c30 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29   ((pgsz-1)&pgsz)
22c40 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65  ==0 );   /* Page
22c50 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
22c60 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20  power of 2 */.  
22c70 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29  if( pgsz<shmsz )
22c80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
22c90 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a  urn pgsz/shmsz;.
22ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  }../*.** Purge t
22cb0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
22cc0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
22cd0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
22ce0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
22cf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
22d00 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
22d10 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
22d20 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
22d30 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
22d40 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
22d50 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
22d60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
22d70 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
22d80 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
22d90 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
22da0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
22db0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
22dc0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
22dd0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c  );.  if( p && AL
22de0 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d 30 29  WAYS(p->nRef==0)
22df0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d   ){.    int nShm
22e00 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d  PerMap = unixShm
22e10 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a  RegionPerMap();.
22e20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61      int i;.    a
22e30 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65  ssert( p->pInode
22e40 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  ==pFd->pInode );
22e50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
22e60 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
22e70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
22e80 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
22e90 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20  =nShmPerMap){.  
22ea0 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
22eb0 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
22ec0 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
22ed0 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
22ee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22f00 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
22f10 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
22f20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
22f30 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
22f40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
22f50 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
22f60 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
22f70 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
22f80 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
22f90 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
22fa0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
22fb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22fc0 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
22fd0 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
22fe0 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
22ff0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
23000 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
23010 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
23020 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
23030 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
23040 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
23050 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
23060 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
23070 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
23080 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
23090 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
230a0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
230b0 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
230c0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
230d0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
230e0 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
230f0 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
23100 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
23110 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
23120 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
23130 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
23140 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
23150 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
23160 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
23170 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
23180 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
23190 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
231a0 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
231b0 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
231c0 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
231d0 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
231e0 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
231f0 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
23200 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
23210 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
23220 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
23230 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
23240 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
23250 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
23260 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
23270 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
23280 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
23290 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
232a0 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
232b0 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
232c0 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
232d0 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
232e0 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
232f0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
23300 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
23310 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
23320 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
23330 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
23340 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
23350 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
23360 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
23370 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
23380 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
23390 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
233a0 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
233b0 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
233c0 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
233d0 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
233e0 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
233f0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
23400 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
23410 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
23420 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
23430 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
23440 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
23450 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
23460 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
23470 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
23480 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
23490 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
234a0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
234b0 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
234c0 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
234d0 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
234e0 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
234f0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
23500 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
23510 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
23520 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
23530 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
23540 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
23550 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
23560 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
23570 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
23580 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
23590 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
235a0 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
235b0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
235c0 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
235d0 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
235e0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
235f0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
23600 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
23610 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
23620 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
23630 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
23640 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
23650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
23660 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
23670 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
23680 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
23690 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
236a0 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
236b0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
236c0 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
236d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
236e0 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
236f0 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
23700 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
23710 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
23720 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
23730 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
23740 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
23750 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
23760 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
23770 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
23780 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
23790 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
237a0 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
237b0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
237c0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
237d0 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
237e0 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
237f0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
23800 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
23810 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
23820 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
23830 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
23840 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
23850 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
23860 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
23870 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
238a0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
238b0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
238c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
238d0 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
238e0 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
238f0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
23900 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
23910 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
23920 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
23930 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
23940 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
23950 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
23960 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
23970 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
23980 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
23990 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
239a0 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
239b0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
239c0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
239d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
239e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
239f0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
23a00 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
23a10 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
23a20 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
23a30 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23a40 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
23a50 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
23a60 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
23a70 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
23a80 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
23a90 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
23aa0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
23ab0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
23ac0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
23ad0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
23ae0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
23af0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
23b00 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
23b10 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
23b20 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
23b30 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
23b40 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
23b50 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69  abase file */.#i
23b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  fndef SQLITE_SHM
23b70 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63  _DIRECTORY.    c
23b80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
23b90 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50  Path = pDbFd->zP
23ba0 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ath;.#endif..   
23bb0 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
23bc0 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
23bd0 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
23be0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
23bf0 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
23c00 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
23c10 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
23c20 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
23c30 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
23c40 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
23c50 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
23c60 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
23c70 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d  ( osFstat(pDbFd-
23c80 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
23c90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23ca0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
23cb0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
23cc0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69  n_err;.    }..#i
23cd0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
23ce0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53  DIRECTORY.    nS
23cf0 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a  hmFilename = siz
23d00 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44  eof(SQLITE_SHM_D
23d10 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a  IRECTORY) + 31;.
23d20 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69  #else.    nShmFi
23d30 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e  lename = 6 + (in
23d40 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61  t)strlen(zBasePa
23d50 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
23d60 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
23d70 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
23d80 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
23d90 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b   nShmFilename );
23da0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
23db0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
23dc0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
23dd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
23de0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
23df0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
23e00 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
23e10 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e  eof(*pShmNode)+n
23e20 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
23e30 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
23e40 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
23e50 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
23e60 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
23e70 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
23e80 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
23e90 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
23ea0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
23eb0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
23ed0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23ee0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
23ef0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
23f10 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
23f20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
23f30 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
23f40 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23f50 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
23f60 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
23f70 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29  shm", zBasePath)
23f80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
23f90 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
23fa0 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e  zPath, zShmFilen
23fb0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ame);.#endif.   
23fc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
23fd0 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
23fe0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
23ff0 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
24000 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
24010 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
24020 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
24030 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
24040 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
24050 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
24060 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
24070 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
24080 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
24090 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
240a0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
240b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
240c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
240d0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
240e0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
240f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e    }..    if( pIn
24100 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
24110 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  k==0 ){.      in
24120 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  t openFlags = O_
24130 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
24140 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24150 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44  3_uri_boolean(pD
24160 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61  bFd->zPath, "rea
24170 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29  donly_shm", 0) )
24180 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c  {.        openFl
24190 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
241a0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
241b0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31  ->isReadonly = 1
241c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
241d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f  pShmNode->h = ro
241e0 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69  bust_open(zShmFi
241f0 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  lename, openFlag
24200 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64  s, (sStat.st_mod
24210 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20  e&0777));.      
24220 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
24230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
24240 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
24250 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
24260 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
24270 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
24280 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
24290 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  n_err;.      }..
242a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
242b0 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
242c0 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b  ing as root, mak
242d0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
242e0 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  SHM file.      *
242f0 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68  * is owned by th
24300 65 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74  e same user that
24310 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e   owns the origin
24320 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74  al database.  Ot
24330 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
24340 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  * the original o
24350 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65  wner will not be
24360 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74   able to connect
24370 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
24380 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53   robustFchown(pS
24390 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74  hmNode->h, sStat
243a0 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73  .st_uid, sStat.s
243b0 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20  t_gid);.  .     
243c0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
243d0 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
243e0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
243f0 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
24400 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ch..      ** If 
24410 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
24420 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
24430 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f  ength. .      */
24440 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24450 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
24460 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
24470 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43  ck(pDbFd, F_WRLC
24480 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
24490 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   1)==SQLITE_OK )
244a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f  {.        if( ro
244b0 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
244c0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29  ShmNode->h, 0) )
244d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
244e0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
244f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
24500 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  EN, "ftruncate",
24510 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
24520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24530 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
24540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24550 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
24560 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
24570 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  d, F_RDLCK, UNIX
24580 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
24590 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
245a0 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
245b0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
245c0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
245d0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
245e0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
245f0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
24600 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
24610 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
24620 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
24630 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
24640 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
24650 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
24660 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
24670 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
24680 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
24690 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
246a0 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
246b0 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
246c0 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
246d0 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
246e0 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
246f0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
24700 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
24710 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
24720 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
24730 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
24740 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
24750 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
24760 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
24770 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
24780 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
24790 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
247a0 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
247b0 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
247c0 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
247d0 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
247e0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
247f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
24800 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
24810 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
24820 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
24830 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
24840 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
24850 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
24860 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
24870 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
24880 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
24890 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
248a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
248b0 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
248c0 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
248d0 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
248e0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
248f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
24900 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
24910 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
24920 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
24930 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
24940 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
24950 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
24960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24970 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
24980 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
24990 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
249a0 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
249b0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
249c0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
249d0 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
249e0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
249f0 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
24a00 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
24a10 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
24a20 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
24a30 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
24a40 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
24a50 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
24a60 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
24a70 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
24a80 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
24a90 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
24aa0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
24ab0 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
24ac0 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
24ad0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
24ae0 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
24af0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
24b00 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
24b10 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
24b20 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
24b30 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
24b40 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
24b50 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
24b60 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
24b70 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
24b80 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
24b90 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
24ba0 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
24bb0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
24bc0 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
24bd0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
24be0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
24bf0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
24c00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
24c10 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
24c20 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
24c30 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
24c40 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
24c50 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
24c60 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
24c70 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
24c80 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
24c90 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
24ca0 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
24cb0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
24cc0 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
24cd0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
24ce0 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
24cf0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
24d00 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
24d10 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
24d20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
24d30 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
24d40 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
24d50 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
24d60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
24d70 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
24d80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
24d90 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
24da0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
24dd0 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
24de0 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
24df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
24e00 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
24e10 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
24e20 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
24e30 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
24e40 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
24e50 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
24e60 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
24e70 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
24e80 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
24e90 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
24ea0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
24eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24ec0 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
24ed0 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
24ee0 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e 74 20  PerMap();.  int 
24ef0 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f  nReqRegion;..  /
24f00 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
24f10 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20  memory file has 
24f20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
24f30 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
24f40 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64  . */.  if( pDbFd
24f50 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->pShm==0 ){.   
24f60 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68   rc = unixOpenSh
24f70 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
24f80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24f90 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
24fa0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  n rc;.  }..  p =
24fb0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
24fc0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
24fd0 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  hmNode;.  sqlite
24fe0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
24ff0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
25000 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
25010 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
25020 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
25030 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
25040 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
25050 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
25060 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
25070 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25080 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
25090 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
250a0 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
250b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
250c0 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
250d0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
250e0 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ock==0 );..  /* 
250f0 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Minimum number o
25100 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72  f regions requir
25110 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e  ed to be mapped.
25120 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e   */.  nReqRegion
25130 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68   = ((iRegion+nSh
25140 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50  mPerMap) / nShmP
25150 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72  erMap) * nShmPer
25160 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  Map;..  if( pShm
25170 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
25180 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
25190 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
251c0 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
251d0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52    int nByte = nR
251e0 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  eqRegion*szRegio
251f0 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  n;   /* Minimum 
25200 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
25210 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
25220 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25240 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
25250 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
25260 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
25270 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
25280 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
25290 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
252a0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
252b0 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
252c0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
252d0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
252e0 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
252f0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
25300 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
25310 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
25320 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
25330 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
25340 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
25350 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
25360 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
25370 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
25380 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
25390 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
253a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
253b0 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
253c0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
253d0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
253e0 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
253f0 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
25400 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
25410 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
25420 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
25430 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
25440 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
25450 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
25460 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
25470 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
25480 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
25490 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
254a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
254b0 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a  if( !bExtend ){.
254c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
254d0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
254e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
254f0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
25500 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
25510 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20  rue, extend the 
25520 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79  file. Do this by
25530 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74  .        ** writ
25540 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
25550 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
25560 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62  each (OS) page b
25570 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  eing.        ** 
25580 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74  allocated or ext
25590 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c  ended. Technical
255a0 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79  ly, we need only
255b0 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
255c0 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61        ** last pa
255d0 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  ge in order to e
255e0 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20  xtend the file. 
255f0 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61  But writing to a
25600 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  ll new.        *
25610 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74  * pages forces t
25620 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74  he OS to allocat
25630 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65  e them immediate
25640 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65  ly, which reduce
25650 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  s.        ** the
25660 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42   chances of SIGB
25670 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  US while accessi
25680 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  ng the mapped re
25690 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20  gion later on.. 
256a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
256b0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
256c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
256d0 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a  nt pgsz = 4096;.
256e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
256f0 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  g;..          /*
25700 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61   Write to the la
25710 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20  st byte of each 
25720 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
25730 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65  or extended page
25740 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
25750 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70  sert( (nByte % p
25760 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  gsz)==0 );.     
25770 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53       for(iPg=(sS
25780 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a  tat.st_size/pgsz
25790 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67  ); iPg<(nByte/pg
257a0 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  sz); iPg++){.   
257b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d           int x =
257c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
257d0 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65  if( seekAndWrite
257e0 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  Fd(pShmNode->h, 
257f0 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d  iPg*pgsz + pgsz-
25800 31 2c 20 22 22 2c 20 31 2c 20 26 78 29 21 3d 31  1, "", 1, &x)!=1
25810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
25830 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ile = pShmNode->
25840 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
25850 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
25860 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
25870 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
25880 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29   "write", zFile)
25890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
258a0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
258b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
258c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
258d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
258e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
258f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
25900 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
25910 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
25920 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
25930 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
25940 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
25950 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
25960 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
25970 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  on, nReqRegion*s
25980 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
25990 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
259a0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
259b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
259c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
259d0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
259e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
259f0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
25a00 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
25a10 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
25a20 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e  egion<nReqRegion
25a30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
25a40 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53  ap = szRegion*nS
25a50 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20  hmPerMap;.      
25a60 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69  int i;.      voi
25a70 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
25a80 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
25a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
25aa0 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d  m = osMmap(0, nM
25ab0 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ap,.            
25ac0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
25ad0 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44  only ? PROT_READ
25ae0 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f   : PROT_READ|PRO
25af0 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20  T_WRITE, .      
25b00 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
25b10 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  , pShmNode->h, s
25b20 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68  zRegion*(i64)pSh
25b30 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20  mNode->nRegion. 
25b40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
25b50 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
25b60 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
25b70 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
25b80 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
25b90 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
25ba0 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
25bb0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
25bc0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
25bd0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
25be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25bf0 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
25c00 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65  e3_malloc64(szRe
25c10 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
25c20 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
25c30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25c40 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25c50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
25c60 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
25c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
25c80 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
25c90 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
25ca0 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
25cb0 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69   i<nShmPerMap; i
25cc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  ++){.        pSh
25cd0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
25ce0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
25cf0 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a 29  n+i] = &((char*)
25d00 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69  pMem)[szRegion*i
25d10 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
25d20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
25d30 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70  on += nShmPerMap
25d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
25d50 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
25d60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
25d70 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
25d80 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
25d90 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
25da0 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
25db0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
25dc0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
25dd0 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
25de0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
25df0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
25e00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
25e10 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
25e20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
25e30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25e40 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
25e50 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
25e60 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
25e70 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
25e80 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
25e90 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
25ea0 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
25eb0 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
25ec0 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
25ed0 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
25ee0 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
25ef0 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
25f00 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
25f10 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
25f20 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
25f30 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
25f40 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
25f50 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
25f60 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
25f70 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
25f80 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
25f90 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
25fa0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
25fb0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
25fc0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
25fd0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
25fe0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
25ff0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
26000 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
26010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26020 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
26030 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
26040 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26060 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
26070 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
26080 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
26090 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
260a0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
260b0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
260c0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
260d0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
260e0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
260f0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
26100 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
26110 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
26120 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
26130 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
26140 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
26150 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
26160 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
26170 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26190 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
261a0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
261b0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
261c0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
261d0 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
261e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
261f0 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
26200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26220 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
26230 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26260 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
26270 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
26280 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
26290 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
262a0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
262b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
262c0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
262d0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
262e0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
262f0 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
26300 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
26310 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
26320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
26330 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
26340 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
26350 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
26360 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
26370 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
26380 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
26390 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
263a0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
263b0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
263c0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
263d0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
263e0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
263f0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
26400 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
26410 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
26420 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
26430 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
26440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
26450 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
26460 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
26470 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
26480 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
26490 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
264a0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
264b0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
264c0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
264d0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
264e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
264f0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
26500 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
26510 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
26520 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
26530 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
26540 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
26550 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
26560 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
26570 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
26580 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
26590 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
265a0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
265b0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
265c0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
265d0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
265e0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
265f0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
26600 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
26610 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
26620 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
26630 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
26640 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
26650 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
26660 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
26670 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
26680 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
26690 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
266a0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
266b0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
266c0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
266d0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
266e0 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _UNLCK, ofst+UNI
266f0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
26700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
26730 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
26740 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
26750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26760 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
26770 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
26780 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
26790 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
267a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
267b0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
267c0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
267d0 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
267e0 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
267f0 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
26800 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
26810 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
26820 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
26830 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
26840 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
26850 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
26860 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
26870 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
26880 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
26890 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
268a0 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
268b0 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
268c0 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
268d0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
268e0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
268f0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
26900 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
26910 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
26920 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26930 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
26940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26950 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
26960 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
26970 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
26980 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
26990 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
269a0 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
269b0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
269c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
269d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
269e0 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
269f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
26a00 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
26a10 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52  mLock(pDbFd, F_R
26a20 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  DLCK, ofst+UNIX_
26a30 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
26a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26a60 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
26a70 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
26a80 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
26a90 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
26aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26ab0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
26ac0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
26ad0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
26ae0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
26af0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
26b00 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
26b10 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
26b20 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
26b30 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
26b40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
26b50 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
26b60 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
26b70 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
26b80 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
26b90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
26ba0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
26bb0 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
26bc0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
26bd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
26be0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
26bf0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
26c00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26c10 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
26c20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
26c30 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
26c40 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
26c50 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
26c60 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
26c70 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
26c80 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
26c90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
26ca0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26cb0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
26cc0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
26cd0 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  Fd, F_WRLCK, ofs
26ce0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
26cf0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
26d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26d10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26d20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
26d30 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
26d40 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
26d50 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
26d60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
26d70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
26d80 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
26d90 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
26da0 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
26db0 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
26dc0 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
26dd0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73         p->id, os
26de0 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73 68  Getpid(0), p->sh
26df0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
26e00 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72  lMask));.  retur
26e10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
26e20 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
26e30 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
26e40 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
26e50 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
26e60 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
26e70 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
26e80 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
26e90 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
26ea0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
26eb0 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
26ec0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
26ed0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
26ee0 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69  oid unixShmBarri
26ef0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
26f00 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
26f10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
26f20 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
26f30 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
26f40 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
26f50 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
26f60 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61   sqlite3MemoryBa
26f70 72 72 69 65 72 28 29 3b 20 20 20 20 20 20 20 20  rrier();        
26f80 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66   /* compiler-def
26f90 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72  ined memory barr
26fa0 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ier */.  unixEnt
26fb0 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  erMutex();      
26fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f           /* Also
26fd0 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75   mutex, for redu
26fe0 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78  ndancy */.  unix
26ff0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
27000 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
27010 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
27020 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
27030 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
27040 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
27050 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
27060 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
27070 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65  here is no share
27080 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
27090 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ted with the con
270a0 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69  nection then thi
270b0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
270c0 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
270d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
270e0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20  unixShmUnmap(.  
270f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
27100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27110 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
27120 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
27130 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
27140 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
27150 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
27160 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20  hared-memory if 
27170 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  true */.){.  uni
27180 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  xShm *p;        
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271a0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
271b0 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
271c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
271d0 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
271e0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
271f0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
27200 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
27210 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
27220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
27230 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
27240 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
27250 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
27260 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
27270 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
27280 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
27290 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
272a0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
272b0 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
272c0 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
272d0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
272e0 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
272f0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
27300 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
27310 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
27320 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
27330 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
27340 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
27350 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
27360 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
27370 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
27380 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
27390 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
273a0 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
273b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
273c0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
273d0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
273e0 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
273f0 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
27400 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
27410 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
27420 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
27430 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
27440 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
27450 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
27460 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
27470 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
27480 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
27490 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
274a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
274b0 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
274c0 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
274d0 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
274e0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
274f0 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45  , too */.  unixE
27500 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
27510 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
27520 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
27530 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
27540 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
27550 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref==0 ){.    if
27560 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20  ( deleteFlag && 
27570 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
27580 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
27590 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
275a0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
275b0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
275c0 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
275d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
275e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
275f0 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
27600 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
27610 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
27620 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
27630 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
27640 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
27650 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
27660 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
27670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27680 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53  IT_WAL */..#if S
27690 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
276a0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69  IZE>0./*.** If i
276b0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d  t is currently m
276c0 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e  emory mapped, un
276d0 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f  map file pFd..*/
276e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
276f0 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
27700 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73  ile *pFd){.  ass
27710 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
27720 4f 75 74 3d 3d 30 20 29 3b 0a 23 69 66 64 65 66  Out==0 );.#ifdef
27730 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d   SQLITE_SHARED_M
27740 41 50 50 49 4e 47 0a 20 20 69 66 28 20 70 46 64  APPING.  if( pFd
27750 2d 3e 70 49 6e 6f 64 65 20 29 20 72 65 74 75 72  ->pInode ) retur
27760 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  n;.#endif.  if( 
27770 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
27780 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  ){.    osMunmap(
27790 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  pFd->pMapRegion,
277a0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
277b0 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e  tual);.    pFd->
277c0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
277d0 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
277e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e  e = 0;.    pFd->
277f0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
27800 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
27810 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
27820 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
27830 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
27840 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c  aintained by fil
27850 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  e .** descriptor
27860 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74   pFd to nNew byt
27870 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67  es. Any existing
27880 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63   mapping is disc
27890 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arded..**.** If 
278a0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
278b0 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
278c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
278d0 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
278e0 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61      unixFile.pMa
278f0 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  pRegion.**      
27900 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
27910 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  ze.**       unix
27920 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74  File.mmapSizeAct
27930 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73  ual.**.** If uns
27940 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72  uccessful, an er
27950 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
27960 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65  ogged via sqlite
27970 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74  3_log() and.** t
27980 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c  he three variabl
27990 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72  es above are zer
279a0 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  oed. In this cas
279b0 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a  e SQLite should.
279c0 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65  ** continue acce
279d0 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
279e0 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65  se using the xRe
279f0 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28  ad() and xWrite(
27a00 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  ).** methods..*/
27a10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
27a20 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e  xRemapfile(.  un
27a30 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20  ixFile *pFd,    
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a50 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
27a60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
27a70 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20   nNew           
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27a90 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67  Required mapping
27aa0 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   size */.){.  co
27ab0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
27ac0 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68   "mmap";.  int h
27ad0 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20   = pFd->h;      
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27af0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
27b00 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69  or open on db fi
27b10 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69  le */.  u8 *pOri
27b20 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70  g = (u8 *)pFd->p
27b30 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20  MapRegion;   /* 
27b40 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
27b50 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20  nt file mapping 
27b60 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d  */.  i64 nOrig =
27b70 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
27b80 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a  tual;     /* Siz
27b90 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f  e of pOrig regio
27ba0 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
27bb0 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20  u8 *pNew = 0;   
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bd0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e       /* Location
27be0 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20   of new mapping 
27bf0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  */.  int flags =
27c00 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20   PROT_READ;     
27c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
27c20 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d  gs to pass to mm
27c30 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ap() */..  asser
27c40 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
27c50 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
27c60 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70  ( nNew>pFd->mmap
27c70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
27c80 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61  ( nNew<=pFd->mma
27c90 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73  pSizeMax );.  as
27ca0 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
27cb0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d    assert( pFd->m
27cc0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70  mapSizeActual>=p
27cd0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
27ce0 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41    assert( MAP_FA
27cf0 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64  ILED!=0 );..#ifd
27d00 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ef SQLITE_MMAP_R
27d10 45 41 44 57 52 49 54 45 0a 20 20 69 66 28 20 28  EADWRITE.  if( (
27d20 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
27d30 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
27d40 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20  )==0 ) flags |= 
27d50 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64  PROT_WRITE;.#end
27d60 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20  if..  if( pOrig 
27d70 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  ){.#if HAVE_MREM
27d80 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  AP.    i64 nReus
27d90 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  e = pFd->mmapSiz
27da0 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  e;.#else.    con
27db0 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65  st int szSyspage
27dc0 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65   = osGetpagesize
27dd0 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75  ();.    i64 nReu
27de0 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53  se = (pFd->mmapS
27df0 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67  ize & ~(szSyspag
27e00 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e-1));.#endif.  
27e10 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f    u8 *pReq = &pO
27e20 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20  rig[nReuse];..  
27e30 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70    /* Unmap any p
27e40 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73  ages of the exis
27e50 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61  ting mapping tha
27e60 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73  t cannot be reus
27e70 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ed. */.    if( n
27e80 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a  Reuse!=nOrig ){.
27e90 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
27ea0 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73  Req, nOrig-nReus
27eb0 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48  e);.    }..#if H
27ec0 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70  AVE_MREMAP.    p
27ed0 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70  New = osMremap(p
27ee0 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e  Orig, nReuse, nN
27ef0 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f  ew, MREMAP_MAYMO
27f00 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  VE);.    zErr = 
27f10 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a  "mremap";.#else.
27f20 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
27f30 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65  p(pReq, nNew-nRe
27f40 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  use, flags, MAP_
27f50 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73  SHARED, h, nReus
27f60 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
27f70 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  !=MAP_FAILED ){.
27f80 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d        if( pNew!=
27f90 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  pReq ){.        
27fa0 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e  osMunmap(pNew, n
27fb0 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20  New - nReuse);. 
27fc0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b         pNew = 0;
27fd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27fe0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72        pNew = pOr
27ff0 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ig;.      }.    
28000 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
28010 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   The attempt to 
28020 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74  extend the exist
28030 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c  ing mapping fail
28040 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a  ed. Free it. */.
28050 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41      if( pNew==MA
28060 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77  P_FAILED || pNew
28070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d  ==0 ){.      osM
28080 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65  unmap(pOrig, nRe
28090 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  use);.    }.  }.
280a0 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73  .  /* If pNew is
280b0 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79   still NULL, try
280c0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e   to create an en
280d0 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69  tirely new mappi
280e0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  ng. */.  if( pNe
280f0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  w==0 ){.    pNew
28100 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65   = osMmap(0, nNe
28110 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  w, flags, MAP_SH
28120 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d  ARED, h, 0);.  }
28130 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41  ..  if( pNew==MA
28140 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
28150 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e  pNew = 0;.    nN
28160 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78  ew = 0;.    unix
28170 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
28180 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a  OK, zErr, pFd->z
28190 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Path);..    /* I
281a0 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f  f the mmap() abo
281b0 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  ve failed, assum
281c0 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65  e that all subse
281d0 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c  quent mmap() cal
281e0 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70  ls.    ** will p
281f0 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f  robably fail too
28200 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75  . Fall back to u
28210 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
28220 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20  e exclusively.  
28230 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
28240 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e  e.  */.    pFd->
28250 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b  mmapSizeMax = 0;
28260 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70  .  }.  pFd->pMap
28270 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a  Region = (void *
28280 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d  )pNew;.  pFd->mm
28290 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d  apSize = pFd->mm
282a0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e  apSizeActual = n
282b0 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  New;.}../*.** Me
282c0 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
282d0 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
282e0 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
282f0 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
28300 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
28310 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
28320 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
28330 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
28340 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
28350 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61   .** there alrea
28360 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70  dy exists a mapp
28370 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ing for this fil
28380 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
28390 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74   still .** outst
283a0 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20  anding xFetch() 
283b0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74  references to it
283c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
283d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
283e0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
283f0 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  Byte is non-nega
28400 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  tive, then it is
28410 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
28420 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d  ize of .** the m
28430 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
28440 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
28450 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
28460 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
28470 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
28480 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65  size is the size
28490 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
284a0 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c  disk. The actual
284b0 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
284c0 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20  created mapping 
284d0 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65  is either the re
284e0 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20  quested size or 
284f0 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
28500 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53  ured .** using S
28510 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
28520 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65  _LIMIT, whicheve
28530 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a  r is smaller..**
28540 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
28550 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
28560 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76  error occurs (ev
28570 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e  en if the mappin
28580 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72  g is not.** recr
28590 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  eated as a resul
285a0 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  t of outstanding
285b0 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20   references) or 
285c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
285d0 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
285e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
285f0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69   unixMapfile(uni
28600 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20  xFile *pFd, i64 
28610 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28  nMap){.  assert(
28620 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
28630 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
28640 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
28650 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53  0 || (pFd->mmapS
28660 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70  ize==0 && pFd->p
28670 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b  MapRegion==0) );
28680 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
28690 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
286a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
286b0 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
286c0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
286d0 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f  tbuf;          /
286e0 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
286f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
28700 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
28710 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66  pFd->h, &statbuf
28720 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
28730 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
28740 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  STAT;.    }.    
28750 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73  nMap = statbuf.s
28760 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  t_size;.  }.  if
28770 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
28780 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
28790 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
287a0 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 23 69 66  izeMax;.  }..#if
287b0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45  def SQLITE_SHARE
287c0 44 5f 4d 41 50 50 49 4e 47 0a 20 20 69 66 28 20  D_MAPPING.  if( 
287d0 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20  pFd->pInode ){. 
287e0 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f     unixInodeInfo
287f0 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 64 2d 3e   *pInode = pFd->
28800 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  pInode;.    if( 
28810 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
28820 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28830 4f 4b 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  OK;.    unixEnte
28840 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
28850 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65  ( pInode->pShare
28860 64 4d 61 70 70 69 6e 67 3d 3d 30 20 29 7b 0a 20  dMapping==0 ){. 
28870 20 20 20 20 20 75 38 20 2a 70 4e 65 77 20 3d 20       u8 *pNew = 
28880 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 20  osMmap(0, nMap, 
28890 50 52 4f 54 5f 52 45 41 44 2c 20 4d 41 50 5f 53  PROT_READ, MAP_S
288a0 48 41 52 45 44 2c 20 70 46 64 2d 3e 68 2c 20 30  HARED, pFd->h, 0
288b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
288c0 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w==MAP_FAILED ){
288d0 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c 6f 67  .        unixLog
288e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c  Error(SQLITE_OK,
288f0 20 22 6d 6d 61 70 22 2c 20 70 46 64 2d 3e 7a 50   "mmap", pFd->zP
28900 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 70 46  ath);.        pF
28910 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  d->mmapSizeMax =
28920 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
28930 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
28940 3e 70 53 68 61 72 65 64 4d 61 70 70 69 6e 67 20  >pSharedMapping 
28950 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
28960 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d  pInode->nSharedM
28970 61 70 70 69 6e 67 20 3d 20 6e 4d 61 70 3b 0a 20  apping = nMap;. 
28980 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28990 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
289a0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72   = pInode->pShar
289b0 65 64 4d 61 70 70 69 6e 67 3b 0a 20 20 20 20 70  edMapping;.    p
289c0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
289d0 61 6c 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  al = pFd->mmapSi
289e0 7a 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ze = pInode->nSh
289f0 61 72 65 64 4d 61 70 70 69 6e 67 3b 0a 20 20 20  aredMapping;.   
28a00 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
28a10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e  LITE_OK;.  }.#en
28a30 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
28a40 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d  Map>0 || (pFd->m
28a50 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46  mapSize==0 && pF
28a60 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
28a70 29 20 29 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21  ) );.  if( nMap!
28a80 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
28a90 7b 0a 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66  {.    unixRemapf
28aa0 69 6c 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a  ile(pFd, nMap);.
28ab0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
28ac0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
28ad0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
28ae0 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
28af0 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
28b00 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
28b10 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
28b20 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
28b30 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
28b40 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
28b50 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
28b60 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
28b70 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
28b80 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
28b90 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
28ba0 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
28bb0 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
28bc0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
28bd0 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
28be0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
28bf0 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
28c00 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
28c10 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
28c20 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
28c30 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
28c40 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
28c50 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
28c60 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
28c70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
28c80 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
28c90 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
28ca0 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
28cb0 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
28cc0 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
28cd0 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73  ually .** releas
28ce0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
28cf0 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55  by calling unixU
28d00 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61  nfetch()..*/.sta
28d10 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63  tic int unixFetc
28d20 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
28d30 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
28d40 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
28d50 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
28d60 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
28d70 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
28d80 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
28d90 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
28da0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
28db0 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a  le */.#endif.  *
28dc0 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c  pp = 0;..#if SQL
28dd0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
28de0 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
28df0 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
28e00 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
28e10 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
28e20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69      int rc = uni
28e30 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  xMapfile(pFd, -1
28e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
28e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28e60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28e70 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
28e80 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
28e90 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
28ea0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
28eb0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
28ec0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
28ed0 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
28ee0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
28ef0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28f00 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
28f10 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
28f20 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
28f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
28f40 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
28f50 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
28f60 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
28f70 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e   to unixFetch().
28f80 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
28f90 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
28fa0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
28fb0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
28fc0 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
28fd0 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
28fe0 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
28ff0 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74  d to the unixFet
29000 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
29010 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
29020 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
29030 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
29040 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
29050 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
29060 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
29070 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
29080 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
29090 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
290a0 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
290b0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
290c0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
290d0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
290e0 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63  c int unixUnfetc
290f0 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
29100 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
29110 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
29120 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
29130 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
29140 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
29150 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
29160 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
29170 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53  e file */.  UNUS
29180 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66  ED_PARAMETER(iOf
29190 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d  f);..  /* If p==
291a0 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
291b0 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
291c0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
291d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
291e0 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
291f0 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
29200 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
29210 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
29220 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
29230 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
29240 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
29250 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
29260 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
29270 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
29280 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
29290 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
292a0 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
292b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
292c0 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
292d0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
292e0 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69  n)[iOff] );..  i
292f0 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
29300 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
29310 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55  }else{.    unixU
29320 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
29330 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
29340 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
29350 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
29360 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
29370 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29380 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
29390 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
293a0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
293b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
293c0 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
293d0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
293e0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
293f0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
29400 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
29410 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
29420 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
29430 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
29440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29450 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
29460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
294a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
294b0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
294c0 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
294d0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
294e0 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
294f0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
29500 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
29510 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
29520 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
29530 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
29540 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
29550 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
29560 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
29570 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
29580 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
29590 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
295a0 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
295b0 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
295c0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
295d0 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
295e0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
295f0 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
29600 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
29610 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
29620 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
29630 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
29640 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
29650 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
29660 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
29670 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
29680 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
29690 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
296a0 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
296b0 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
296c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
296d0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
296e0 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
296f0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
29700 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
29710 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
29720 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
29730 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
29740 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
29750 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20  function F, two 
29760 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
29770 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ted:.**.**    (1
29780 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65  ) The real finde
29790 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  r-function named
297a0 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a   "FImpt()"..**.*
297b0 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74  *    (2) A const
297c0 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ant pointer to t
297d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  his function nam
297e0 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a  ed just "F"..**.
297f0 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
29800 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72  to the F pointer
29810 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
29820 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66  pAppData value f
29830 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74  or VFS.** object
29840 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  s.  We have to d
29850 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f  o this instead o
29860 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61  f letting pAppDa
29870 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65  ta point.** dire
29880 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64  ctly at the find
29890 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63  er-function sinc
298a0 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76  e C90 rules prev
298b0 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66  ent a void*.** f
298c0 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f  rom be cast into
298d0 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
298e0 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61  ter..**.**.** Ea
298f0 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
29900 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61  his macro genera
29910 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a  tes two objects:
29920 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f  .**.**   *  A co
29930 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69  nstant sqlite3_i
29940 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29950 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61   call METHOD tha
29960 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  t has locking.**
29970 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c        methods CL
29980 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
29990 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a  K, CKRESLOCK..**
299a0 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20  .**   *  An I/O 
299b0 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
299c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49  nction called FI
299d0 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e  NDER that return
299e0 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20  s a pointer.**  
299f0 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f      to the METHO
29a00 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  D object in the 
29a10 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e  previous bullet.
29a20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45  .*/.#define IOME
29a30 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54  THODS(FINDER,MET
29a40 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53  HOD,VERSION,CLOS
29a50 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b  E,LOCK,UNLOCK,CK
29a60 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20  LOCK,SHMMAP)    
29a70 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
29a80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29a90 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20  ds METHOD = {   
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20  \.   VERSION,   
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ae0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20   /* iVersion */ 
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29b10 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20  .   CLOSE,      
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b30 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20  /* xClose */    
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29b60 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20     unixRead,    
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b80 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20  * xRead */      
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29bb0 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20    unixWrite,    
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29bd0 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20   xWrite */      
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29c00 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20   unixTruncate,  
29c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20  xTruncate */    
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29c50 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20  unixSync,       
29c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29c70 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20  Sync */         
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29ca0 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  nixFileSize,    
29cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
29cc0 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  ileSize */      
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 5c 0a 20 20 20 4c 4f           \.   LO
29cf0 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
29d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29d10 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
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 5c 0a 20 20 20 55 4e 4c          \.   UNL
29d40 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
29d50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29d60 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
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 5c 0a 20 20 20 43 4b 4c 4f         \.   CKLO
29d90 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
29da0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
29db0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
29de0 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
29df0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
29e00 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20  ontrol */       
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65       \.   unixSe
29e30 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
29e40 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
29e50 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76      \.   unixDev
29e80 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
29e90 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43  cs,  /* xDeviceC
29ea0 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20  apabilities */  
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20     \.   SHMMAP, 
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
29ef0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f    \.   unixShmLo
29f20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29f30 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
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 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72   \.   unixShmBar
29f70 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
29f80 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
29f90 20 2a 2f 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 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61  \.   unixShmUnma
29fc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
29fd0 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a000 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20  .   unixFetch,  
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a020 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20  /* xFetch */    
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a050 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20     unixUnfetch, 
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a070 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20  * xUnfetch */   
2a080 20 20 20 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 5c 0a 7d               \.}
2a0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
2a0f0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a100 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
2a110 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
2a120 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
2a130 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
2a140 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a150 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
2a160 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
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 5c 0a 20 20 72 65            \.  re
2a190 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 7d 20 20 20 20           \.}    
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 73 74 61 74 69 63          \.static
2a230 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a240 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
2a250 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
2a260 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
2a270 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
2a280 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
2a290 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
2a2a0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
2a2b0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a2c0 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
2a2d0 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
2a2e0 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
2a2f0 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
2a300 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
2a310 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
2a320 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
2a330 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
2a340 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
2a350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a360 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a370 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
2a380 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2a390 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a3a0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a3b0 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a3e0 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20  ry and mmap are 
2a3f0 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  enabled */.  uni
2a400 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
2a410 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2a420 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
2a430 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
2a440 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2a450 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2a460 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2a470 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2a480 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
2a490 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2a4a0 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck,    /* xCheck
2a4b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2a4c0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  hod */.  unixShm
2a4d0 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Map             
2a4e0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2a4f0 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
2a500 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
2a510 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2a520 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a530 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
2a540 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
2a550 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a560 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a570 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
2a580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a590 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a5a0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a5b0 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
2a5c0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
2a5d0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a5e0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2a5f0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
2a600 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a610 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
2a620 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2a630 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a640 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2a650 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
2a660 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck,  /* xCheckRe
2a670 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a680 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6a0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2a6b0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2a6c0 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
2a6d0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
2a6e0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2a6f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
2a700 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
2a710 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2a720 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2a730 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2a760 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2a770 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
2a780 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2a790 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2a7a0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2a7b0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2a7c0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2a7d0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
2a7e0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2a7f0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2a800 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2a810 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a820 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k, /* xCheckRese
2a830 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2a840 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a860 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2a870 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
2a880 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a890 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2a8a0 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
2a8b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2a8c0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2a8d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
2a8e0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2a8f0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2a900 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a910 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a930 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2a940 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2a950 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
2a960 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2a970 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2a980 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
2a990 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a9a0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2a9b0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
2a9c0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a9d0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2a9e0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
2a9f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2aa00 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2aa10 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2aa20 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa40 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2aa50 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2aa60 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
2aa70 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
2aa80 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2aa90 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2aaa0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2aab0 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
2aac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2aad0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2aae0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2aaf0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2ab00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2ab10 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2ab20 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d  isabled */.  sem
2ab30 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  XClose,         
2ab40 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2ab50 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2ab60 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  XLock,          
2ab70 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2ab80 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58  method */.  semX
2ab90 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2aba0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2abb0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2abc0 58 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  XCheckReservedLo
2abd0 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck,    /* xCheck
2abe0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2abf0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac10 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2ac20 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2ac30 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
2ac40 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2ac50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2ac60 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
2ac70 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
2ac80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ac90 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2aca0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
2acb0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2acc0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2acd0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2ace0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2ad10 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2ad20 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
2ad30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2ad40 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2ad50 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
2ad60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ad70 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2ad80 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
2ad90 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2ada0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2adb0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
2adc0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2add0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2ade0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2adf0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae10 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2ae20 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2ae30 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
2ae40 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
2ae50 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
2ae60 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
2ae70 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
2ae80 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
2ae90 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
2aea0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
2aeb0 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
2aec0 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
2aed0 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
2aee0 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
2aef0 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
2af00 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
2af10 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
2af20 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
2af30 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
2af40 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
2af50 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
2af60 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
2af70 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
2af80 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
2af90 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
2afa0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
2afb0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
2afc0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2afd0 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
2afe0 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
2aff0 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
2b000 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
2b010 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
2b020 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2b030 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b040 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
2b050 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
2b060 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
2b070 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2b080 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
2b090 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
2b0a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
2b0b0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2b0c0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
2b0d0 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
2b0e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
2b0f0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
2b100 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
2b110 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
2b120 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b130 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b140 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
2b150 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2b160 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2b170 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2b180 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2b1b0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2b1c0 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b1e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b1f0 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
2b200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b210 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b220 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
2b230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b240 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2b250 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
2b260 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
2b270 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b280 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b2b0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2b2c0 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f  endif../* nfs lo
2b2d0 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b  ckd on OSX 10.3+
2b2e0 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77   doesn't clear w
2b2f0 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20  rite locks when 
2b300 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
2b310 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  et */.#if define
2b320 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2b330 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b340 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
2b350 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69  THODS(.  nfsIoFi
2b360 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2b370 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2b380 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2b390 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20   nfsIoMethods,  
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2b3b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b3c0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2b3d0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b3f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2b400 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2b410 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
2b420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2b430 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2b440 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2b450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b460 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b470 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
2b480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b490 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2b4a0 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
2b4b0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
2b4c0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2b4d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b4e0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2b4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2b500 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2b510 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
2b520 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b530 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b540 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b550 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
2b560 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
2b570 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
2b580 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
2b590 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
2b5a0 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
2b5b0 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
2b5c0 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
2b5d0 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
2b5e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
2b5f0 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
2b600 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
2b610 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
2b620 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e  is for MacOSX on
2b630 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
2b640 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2b650 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
2b660 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2b670 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2b680 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2b690 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2b6a0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2b6b0 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2b6c0 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65      /* open file
2b6d0 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
2b6e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2b6f0 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
2b700 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e  st struct Mappin
2b710 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  g {.    const ch
2b720 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b  ar *zFilesystem;
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b740 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   Filesystem type
2b750 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   name */.    con
2b760 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2b770 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b  thods *pMethods;
2b780 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74     /* Appropriat
2b790 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
2b7a0 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d   */.  } aMap[] =
2b7b0 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
2b7c0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
2b7d0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73  ds },.    { "ufs
2b7e0 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
2b7f0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2b800 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  afpfs",  &afpIoM
2b810 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2b820 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
2b830 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2b840 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
2b850 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
2b860 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
2b870 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2b880 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2b890 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
2b8a0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2b8b0 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2b8c0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2b8d0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2b8e0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2b8f0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2b900 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2b910 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2b920 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2b930 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2b940 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2b950 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
2b960 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
2b970 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
2b980 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
2b990 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
2b9a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b9b0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2b9c0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
2b9d0 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
2b9e0 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
2b9f0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2ba00 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2ba10 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
2ba20 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
2ba30 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ba40 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
2ba50 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
2ba60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
2ba70 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
2ba80 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
2ba90 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
2baa0 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
2bab0 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
2bac0 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
2bad0 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
2bae0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2baf0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2bb00 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
2bb10 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
2bb20 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2bb30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2bb40 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2bb50 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2bb60 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2bb70 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2bb80 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2bb90 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2bba0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2bbb0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66  )!=-1 ) {.    if
2bbc0 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2bbd0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
2bbe0 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
2bbf0 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65   return &nfsIoMe
2bc00 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73  thods;.    } els
2bc10 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e {.      return
2bc20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2bc30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2bc40 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74  .    return &dot
2bc50 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2bc60 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2bc70 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2bc80 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2bc90 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2bca0 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
2bcb0 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
2bcc0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2bcd0 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
2bce0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2bcf0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2bd00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2bd10 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
2bd20 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69  S./*.** This "fi
2bd30 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66  nder" function f
2bd40 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b  or VxWorks check
2bd50 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69  s to see if posi
2bd60 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f  x advisory.** lo
2bd70 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66  cking works.  If
2bd80 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74   it does, then t
2bd90 68 61 74 20 69 73 20 77 68 61 74 20 69 73 20 75  hat is what is u
2bda0 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73  sed.  If it does
2bdb0 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68   not.** work, th
2bdc0 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e  en fallback to n
2bdd0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2bde0 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
2bdf0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2be00 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f  io_methods *vxwo
2be10 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  rksIoFinderImpl(
2be20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2be30 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2be40 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2be50 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2be60 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2be70 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70         /* the op
2be80 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a  en file object *
2be90 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
2bea0 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2beb0 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2bec0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2bed0 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2bee0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2bef0 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2bf00 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2bf10 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2bf20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2bf30 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2bf40 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2bf50 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73  s;.  }..  /* Tes
2bf60 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20  t if fcntl() is 
2bf70 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73  supported and us
2bf80 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  e POSIX style lo
2bf90 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  cks..  ** Otherw
2bfa0 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ise fall back to
2bfb0 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
2bfc0 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a  hore method..  *
2bfd0 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2bfe0 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2bff0 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2c000 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2c010 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2c020 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2c030 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2c040 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2c050 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2c060 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2c070 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2c080 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  xIoMethods;.  }e
2c090 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2c0a0 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &semIoMethods;. 
2c0b0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2c0c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2c0d0 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2c0e0 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72   vxworksIoFinder
2c0f0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2c100 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72  ixFile*) = vxwor
2c110 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ksIoFinderImpl;.
2c120 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
2c130 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WORKS */../*.** 
2c140 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
2c150 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
2c160 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66  o an IO method f
2c170 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a  inder function:.
2c180 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74  */.typedef const
2c190 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c1a0 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79  ods *(*finder_ty
2c1b0 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pe)(const char*,
2c1c0 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a  unixFile*);.../*
2c1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2c220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c230 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
2c240 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
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 0a 2a 2a 0a 2a 2a 20  *********.**.** 
2c270 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
2c280 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
2c290 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
2c2a0 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
2c2b0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
2c2c0 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  t..*/../*.** Ini
2c2d0 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
2c2e0 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78  ents of the unix
2c2f0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  File structure p
2c300 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64  ointed to by pId
2c310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c320 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
2c330 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2c340 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  Vfs,      /* Poi
2c350 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2c360 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  ct */.  int h,  
2c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c380 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
2c390 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20  criptor of file 
2c3a0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2c3b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2c3c0 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
2c3d0 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
2c3e0 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
2c3f0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c400 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
2c410 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
2c420 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2c430 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
2c440 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
2c450 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49  Zero or more UNI
2c460 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a  XFILE_* values *
2c470 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
2c480 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c490 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
2c4a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2c4b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2c4c0 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
2c4d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2c4e0 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  ert( pNew->pInod
2c4f0 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  e==NULL );..  /*
2c500 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74   Usually the pat
2c510 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75  h zFilename shou
2c520 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61  ld not be a rela
2c530 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54  tive pathname. T
2c540 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f  he.  ** exceptio
2c550 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e  n is when openin
2c560 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e  g the proxy "con
2c570 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c  ch" file in buil
2c580 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63  ds that.  ** inc
2c590 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 61 6c  lude the special
2c5a0 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73   Apple locking s
2c5b0 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20  tyles..  */.#if 
2c5c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2c5d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2c5e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c5f0 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  E.  assert( zFil
2c600 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
2c610 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20  ename[0]=='/' . 
2c620 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70     || pVfs->pApp
2c630 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75  Data==(void*)&au
2c640 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  tolockIoFinder )
2c650 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74  ;.#else.  assert
2c660 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
2c670 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
2c680 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  '/' );.#endif.. 
2c690 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f   /* No locking o
2c6a0 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61  ccurs in tempora
2c6b0 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73  ry files */.  as
2c6c0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21  sert( zFilename!
2c6d0 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73  =0 || (ctrlFlags
2c6e0 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
2c6f0 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54  CK)!=0 );..  OST
2c700 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25  RACE(("OPEN    %
2c710 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46  -3d %s\n", h, zF
2c720 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65  ilename));.  pNe
2c730 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
2c740 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2c750 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a   pNew->zPath = z
2c760 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77  Filename;.  pNew
2c770 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75  ->ctrlFlags = (u
2c780 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66  8)ctrlFlags;.#if
2c790 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
2c7a0 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e  _SIZE>0.  pNew->
2c7b0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71  mmapSizeMax = sq
2c7c0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c7d0 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66  g.szMmap;.#endif
2c7e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
2c7f0 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72  ri_boolean(((ctr
2c800 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2c810 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61  E_URI) ? zFilena
2c820 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20  me : 0),.       
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c840 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49      "psow", SQLI
2c850 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
2c860 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
2c870 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2c880 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b  = UNIXFILE_PSOW;
2c890 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d  .  }.  if( strcm
2c8a0 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75  p(pVfs->zName,"u
2c8b0 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b  nix-excl")==0 ){
2c8c0 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2c8d0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2c8e0 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20  _EXCL;.  }..#if 
2c8f0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65  OS_VXWORKS.  pNe
2c900 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73  w->pId = vxworks
2c910 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65  FindFileId(zFile
2c920 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  name);.  if( pNe
2c930 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20  w->pId==0 ){.   
2c940 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2c950 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2c960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c970 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  OMEM_BKPT;.  }.#
2c980 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72  endif..  if( ctr
2c990 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2c9a0 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
2c9b0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2c9c0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2c9d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2c9e0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2c9f0 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2ca00 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2ca10 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2ca20 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2ca30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ca40 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2ca50 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2ca60 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2ca70 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2ca80 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2ca90 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2caa0 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2cab0 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2cac0 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2cad0 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2cae0 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2caf0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2cb00 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2cb10 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2cb20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2cb30 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2cb40 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2cb50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2cb60 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2cb70 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2cb80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2cb90 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2cba0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2cbb0 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2cbc0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2cbd0 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2cbe0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
2cbf0 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 20  ARED_MAPPING.   
2cc00 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
2cc10 65 20 3d 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  e == &nolockIoMe
2cc20 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
2cc30 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
2cc40 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2cc50 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2cc60 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2cc70 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2cc80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cc90 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2cca0 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66  or occurred in f
2ccb0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
2ccc0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
2ccd0 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
2cce0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
2ccf0 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
2cd00 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
2cd10 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
2cd20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
2cd30 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
2cd40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2cd50 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
2cd60 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
2cd70 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
2cd80 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
2cd90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2cda0 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
2cdb0 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
2cdc0 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
2cdd0 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
2cde0 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
2cdf0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2ce00 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2ce10 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
2ce20 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
2ce30 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
2ce40 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
2ce50 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
2ce60 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
2ce70 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
2ce80 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
2ce90 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
2cea0 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
2ceb0 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
2cec0 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
2ced0 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
2cee0 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
2cef0 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
2cf00 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
2cf10 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
2cf20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2cf30 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
2cf40 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
2cf50 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
2cf60 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
2cf70 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
2cf80 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
2cf90 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
2cfa0 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
2cfb0 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
2cfc0 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
2cfd0 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
2cfe0 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
2cff0 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
2d000 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
2d010 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2d020 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2d030 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
2d040 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
2d050 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d060 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
2d070 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d080 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2d090 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
2d0a0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2d0b0 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
2d0c0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2d0d0 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
2d0e0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2d0f0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2d100 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2d110 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
2d120 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
2d130 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
2d140 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2d150 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2d160 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
2d170 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2d180 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  4( sizeof(*pCtx)
2d190 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2d1a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2d1b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2d1c0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2d1d0 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2d1e0 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2d1f0 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2d200 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2d210 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2d220 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2d230 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2d240 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2d250 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2d260 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2d270 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2d280 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2d290 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2d2a0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2d2b0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2d2c0 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2d2d0 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2d2e0 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2d2f0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2d300 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2d310 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2d320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d330 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d340 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2d350 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2d360 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2d370 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2d380 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2d390 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2d3a0 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2d3b0 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2d3c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2d3d0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2d3e0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2d3f0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2d400 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2d410 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2d420 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2d430 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2d440 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2d450 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2d460 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2d470 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2d480 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2d490 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2d4a0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2d4b0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2d4c0 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2d4d0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2d4e0 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2d4f0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2d500 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c  e3_malloc64(nFil
2d510 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2d520 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2d530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d540 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2d560 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d570 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
2d580 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
2d590 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
2d5a0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
2d5b0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2d5c0 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
2d5d0 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
2d5e0 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
2d5f0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d600 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
2d610 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
2d620 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
2d630 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2d640 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2d650 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
2d660 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
2d670 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
2d680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
2d690 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d6a0 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2d6b0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2d6c0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2d6d0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
2d6e0 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
2d6f0 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
2d700 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2d710 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
2d720 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2d730 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
2d740 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2d750 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
2d760 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
2d770 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
2d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d790 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
2d7a0 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
2d7b0 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
2d7c0 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
2d7d0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
2d7e0 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
2d7f0 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
2d800 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
2d810 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
2d820 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
2d830 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
2d840 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2d850 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2d860 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
2d870 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2d880 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2d890 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2d8a0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
2d8b0 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
2d8c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
2d8d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2d8e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73   }.#endif.  .  s
2d8f0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e  toreLastErrno(pN
2d900 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56  ew, 0);.#if OS_V
2d910 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
2d920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d930 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2d940 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2d950 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2d960 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73    h = -1;.    os
2d970 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  Unlink(zFilename
2d980 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  );.    pNew->ctr
2d990 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2d9a0 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23  LE_DELETE;.  }.#
2d9b0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
2d9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d9d0 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
2d9e0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2d9f0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
2da00 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
2da10 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69  pMethod = pLocki
2da20 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65  ngStyle;.    Ope
2da30 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
2da40 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
2da50 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  New);.  }.  retu
2da60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2da70 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
2da80 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
2da90 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
2daa0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
2dab0 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
2dac0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2dad0 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
2dae0 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
2daf0 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
2db00 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
2db10 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
2db20 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2db30 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
2db40 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
2db50 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
2db60 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
2db70 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
2db80 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d  p",.     ".".  }
2db90 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2dba0 20 69 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74   i = 0;.  struct
2dbb0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2dbc0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2dbd0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2dbe0 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21  ectory;..  if( !
2dbf0 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
2dc00 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
2dc10 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
2dc20 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
2dc30 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
2dc40 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
2dc50 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ;.  while(1){.  
2dc60 20 20 69 66 28 20 7a 44 69 72 21 3d 30 0a 20 20    if( zDir!=0.  
2dc70 20 20 20 26 26 20 6f 73 53 74 61 74 28 7a 44 69     && osStat(zDi
2dc80 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20 20 20  r, &buf)==0.    
2dc90 20 26 26 20 53 5f 49 53 44 49 52 28 62 75 66 2e   && S_ISDIR(buf.
2dca0 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 26 26  st_mode).     &&
2dcb0 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20   osAccess(zDir, 
2dcc0 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  03)==0.    ){.  
2dcd0 20 20 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b      return zDir;
2dce0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2dcf0 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  >=sizeof(azDirs)
2dd00 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
2dd10 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ]) ) break;.    
2dd20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b  zDir = azDirs[i+
2dd30 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +];.  }.  return
2dd40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2dd50 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
2dd60 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
2dd70 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
2dd80 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
2dd90 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
2dda0 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
2ddb0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2ddc0 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
2ddd0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2dde0 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
2ddf0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
2de00 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
2de10 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
2de20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2de30 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
2de40 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  0;..  /* It's od
2de50 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2de60 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2de70 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2de80 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2de90 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2dea0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2deb0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2dec0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2ded0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2dee0 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a  iling. .  */.  z
2def0 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69  Buf[0] = 0;.  Si
2df00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2df10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2df20 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
2df30 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2df40 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
2df50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2df60 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
2df70 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36  TH;.  do{.    u6
2df80 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  4 r;.    sqlite3
2df90 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
2dfa0 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
2dfb0 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29  assert( nBuf>2 )
2dfc0 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d  ;.    zBuf[nBuf-
2dfd0 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  2] = 0;.    sqli
2dfe0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2dff0 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  f, zBuf, "%s/"SQ
2e000 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2e010 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20  REFIX"%llx%c",. 
2e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e030 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b      zDir, r, 0);
2e040 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42  .    if( zBuf[nB
2e050 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69  uf-2]!=0 || (iLi
2e060 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75  mit++)>10 ) retu
2e070 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2e080 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63  .  }while( osAcc
2e090 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
2e0a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e0b0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
2e0c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2e0d0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2e0e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
2e0f0 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
2e100 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
2e110 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
2e120 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
2e130 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
2e140 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
2e150 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
2e160 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
2e170 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
2e180 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2e190 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
2e1a0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2e1b0 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
2e1c0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
2e1d0 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
2e1e0 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r*);.#endif../*.
2e1f0 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  ** Search for an
2e200 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2e210 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73  criptor that was
2e220 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64   opened on the d
2e230 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2e240 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20   (not a journal 
2e250 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  or master-journa
2e260 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69  l file) identifi
2e270 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a  ed by pathname.*
2e280 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c  * zPath with SQL
2e290 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
2e2a0 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73  gs matching thos
2e2b0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2e2c0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
2e2d0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2e2e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20  ion..**.** Such 
2e2f0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
2e300 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61  r may exist if a
2e310 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2e320 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a  tion was closed.
2e330 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63  ** but the assoc
2e340 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72  iated file descr
2e350 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  iptor could not 
2e360 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73  be closed becaus
2e370 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  e some.** other 
2e380 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e390 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2e3a0 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67   file is holding
2e3b0 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a   a file-lock..**
2e3c0 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
2e3d0 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c  ts in the unixCl
2e3e0 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ose() function a
2e3f0 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63  nd the lengthy c
2e400 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69  omment.** descri
2e410 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69  bing "Posix Advi
2e420 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74  sory Locking" at
2e430 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2e440 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  is file for .** 
2e450 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e  further details.
2e460 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34   Also, ticket #4
2e470 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  018..**.** If a 
2e480 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65  suitable file de
2e490 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e  scriptor is foun
2e4a0 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65  d, then it is re
2e4b0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a  turned. If no.**
2e4c0 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
2e4d0 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64  iptor is located
2e4e0 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
2e4f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78  ..*/.static Unix
2e500 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65  UnusedFd *findRe
2e510 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63  usableFd(const c
2e520 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
2e530 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e  flags){.  UnixUn
2e540 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2e550 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  = 0;..  /* Do no
2e560 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  t search for an 
2e570 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2e580 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b  riptor on vxwork
2e590 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20  s. Not because. 
2e5a0 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c   ** vxworks woul
2e5b0 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72  d not benefit fr
2e5c0 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69  om the change (i
2e5d0 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e  t might, we're n
2e5e0 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62  ot sure),.  ** b
2e5f0 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61  ut because no wa
2e600 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20  y to test it is 
2e610 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
2e620 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65  ble. It is bette
2e630 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72  r .  ** not to r
2e640 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77  isk breaking vxw
2e650 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72  orks support for
2e660 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63   the sake of suc
2e670 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20  h an obscure .  
2e680 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a  ** feature.  */.
2e690 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2e6a0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2e6b0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2e6c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2e6d0 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c  s of stat() call
2e6e0 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72   */..  unixEnter
2e6f0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41  Mutex();..  /* A
2e700 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
2e710 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
2e720 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
2e730 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
2e740 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
2e750 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
2e760 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
2e770 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
2e780 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
2e790 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2e7a0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2e7b0 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
2e7c0 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
2e7d0 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
2e7e0 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
2e7f0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
2e800 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
2e810 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
2e820 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
2e830 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
2e840 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
2e850 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
2e860 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
2e870 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
2e880 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
2e890 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
2e8a0 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
2e8b0 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
2e8c0 67 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65  g for a reusable
2e8d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e8e0 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
2e8f0 2a 2f 0a 20 20 69 66 28 20 6e 55 6e 75 73 65 64  */.  if( nUnused
2e900 46 64 3e 30 20 26 26 20 30 3d 3d 6f 73 53 74 61  Fd>0 && 0==osSta
2e910 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2e920 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2e930 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2e940 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
2e950 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
2e960 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
2e970 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
2e980 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
2e9b0 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75 36 34 29  ileId.ino!=(u64)
2e9c0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
2e9d0 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
2e9e0 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
2e9f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2ea00 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
2ea10 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
2ea20 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
2ea30 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
2ea40 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
2ea50 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
2ea60 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
2ea70 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2ea80 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
2ea90 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2eaa0 20 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a     nUnusedFd--;.
2eab0 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55          *pp = pU
2eac0 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  nused->pNext;.  
2ead0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2eae0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2eaf0 28 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ();.#endif    /*
2eb00 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
2eb10 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
2eb20 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  sed;.}../*.** Fi
2eb30 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64  nd the mode, uid
2eb40 20 61 6e 64 20 67 69 64 20 6f 66 20 66 69 6c 65   and gid of file
2eb50 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74 61 74   zFile. .*/.stat
2eb60 69 63 20 69 6e 74 20 67 65 74 46 69 6c 65 4d 6f  ic int getFileMo
2eb70 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
2eb80 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *zFile,        
2eb90 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
2eba0 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  me */.  mode_t *
2ebb0 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2ebc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2ebd0 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 7a  Permissions of z
2ebe0 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f 74 20  File */.  uid_t 
2ebf0 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20  *pUid,          
2ec00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2ec10 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20  : uid of zFile. 
2ec20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64  */.  gid_t *pGid
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec40 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64       /* OUT: gid
2ec50 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 29 7b   of zFile. */.){
2ec60 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2ec70 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2ec80 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20     /* Output of 
2ec90 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61  stat() on databa
2eca0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2ecb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ecc0 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
2ecd0 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74 29 20  (zFile, &sStat) 
2ece0 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2ecf0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2ed00 30 37 37 37 3b 0a 20 20 20 20 2a 70 55 69 64 20  0777;.    *pUid 
2ed10 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a  = sStat.st_uid;.
2ed20 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
2ed30 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65 6c 73  t.st_gid;.  }els
2ed40 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
2ed50 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
2ed60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ed70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2ed80 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2ed90 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
2eda0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2edb0 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
2edc0 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
2edd0 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
2ede0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2edf0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2ee00 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
2ee10 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
2ee20 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
2ee30 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
2ee40 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
2ee50 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
2ee60 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
2ee70 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2ee80 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
2ee90 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
2eea0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2eeb0 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
2eec0 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
2eed0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
2eee0 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2eef0 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2ef00 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2ef10 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2ef20 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2ef30 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2ef40 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2ef50 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2ef60 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2ef70 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2ef80 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2ef90 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2efa0 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2efb0 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2efc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2efd0 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2efe0 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2eff0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2f000 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2f010 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2f020 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2f030 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2f040 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2f050 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2f060 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2f070 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2f080 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2f090 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2f0a0 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2f0b0 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2f0c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2f0d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2f0e0 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2f0f0 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2f100 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2f110 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2f120 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2f130 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2f140 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2f150 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2f160 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2f170 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2f180 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2f190 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2f1a0 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2f1b0 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2f1c0 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2f1d0 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2f1e0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2f1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2f200 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2f210 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2f220 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2f230 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2f240 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2f250 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2f260 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2f270 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2f280 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2f290 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2f2a0 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2f2b0 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2f2c0 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2e0 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2f2f0 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2f300 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2f310 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2f320 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2f330 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2f340 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2f350 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f370 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2f380 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2f390 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2f3a0 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2f3b0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2f3c0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2f3d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2f3e0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2f3f0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2f400 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2f410 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2f420 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2f450 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2f460 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74   */..    /* zPat
2f470 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61  h is a path to a
2f480 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   WAL or journal 
2f490 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  file. The follow
2f4a0 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65  ing block derive
2f4b0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74  s.    ** the pat
2f4c0 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  h to the associa
2f4d0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2f4e0 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68  e from zPath. Th
2f4f0 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
2f500 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
2f510 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e  owing naming con
2f520 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a  ventions:.    **
2f530 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f540 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22   to db>-journal"
2f550 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f560 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20   to db>-wal".   
2f570 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2f580 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20  db>-journalNN". 
2f590 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2f5a0 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20  o db>-walNN".   
2f5b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
2f5c0 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c   NN is a decimal
2f5d0 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20   number. The NN 
2f5e0 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61  naming schemes a
2f5f0 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  re .    ** used 
2f600 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74  by the test_mult
2f610 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a  iplex.c module..
2f620 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d      */.    nDb =
2f630 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2f640 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20  (zPath) - 1; .  
2f650 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e    while( zPath[n
2f660 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 23 69 66 6e  Db]!='-' ){.#ifn
2f670 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2f680 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20  E_8_3_NAMES.    
2f690 20 20 2f 2a 20 49 6e 20 74 68 65 20 6e 6f 72 6d    /* In the norm
2f6a0 61 6c 20 63 61 73 65 20 28 38 2b 33 20 66 69 6c  al case (8+3 fil
2f6b0 65 6e 61 6d 65 73 20 64 69 73 61 62 6c 65 64 29  enames disabled)
2f6c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f6d0 65 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 69  ename.      ** i
2f6e0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2f6f0 63 6f 6e 74 61 69 6e 20 61 20 27 2d 27 20 63 68  contain a '-' ch
2f700 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20  aracter. */.    
2f710 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20    assert( nDb>0 
2f720 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f730 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28   sqlite3Isalnum(
2f740 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 3b 0a 23  zPath[nDb]) );.#
2f750 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
2f760 20 38 2b 33 20 6e 61 6d 65 73 20 61 72 65 20 70   8+3 names are p
2f770 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e 20 74 68  ossible, then th
2f780 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
2f790 69 67 68 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  ight not contain
2f7a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 27 2d 27 20  .      ** a '-' 
2f7b0 63 68 61 72 61 63 74 65 72 2e 20 20 53 6f 20 63  character.  So c
2f7c0 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 63 61  heck for that ca
2f7d0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 65 61  se and return ea
2f7e0 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  rly. */.      if
2f7f0 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74  ( nDb==0 || zPat
2f800 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65  h[nDb]=='.' ) re
2f810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f820 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 44 62  #endif.      nDb
2f830 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  --;.    }.    me
2f840 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c  mcpy(zDb, zPath,
2f850 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e   nDb);.    zDb[n
2f860 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  Db] = '\0';..   
2f870 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64   rc = getFileMod
2f880 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c 20 70 55  e(zDb, pMode, pU
2f890 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 7d 65 6c  id, pGid);.  }el
2f8a0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
2f8b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
2f8c0 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
2f8d0 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20  *pMode = 0600;. 
2f8e0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
2f8f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
2f900 52 49 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  RI ){.    /* If 
2f910 74 68 69 73 20 69 73 20 61 20 6d 61 69 6e 20 64  this is a main d
2f920 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2f930 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
2f940 65 6e 65 64 20 75 73 69 6e 67 20 61 20 55 52 49  ened using a URI
2f950 0a 20 20 20 20 2a 2a 20 66 69 6c 65 6e 61 6d 65  .    ** filename
2f960 2c 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20  , check for the 
2f970 22 6d 6f 64 65 6f 66 22 20 70 61 72 61 6d 65 74  "modeof" paramet
2f980 65 72 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20  er. If present, 
2f990 69 6e 74 65 72 70 72 65 74 0a 20 20 20 20 2a 2a  interpret.    **
2f9a0 20 69 74 73 20 76 61 6c 75 65 20 61 73 20 61 20   its value as a 
2f9b0 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 74 72 79  filename and try
2f9c0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6d 6f 64   to copy the mod
2f9d0 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20 66  e, uid and gid f
2f9e0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  rom.    ** that 
2f9f0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 63 6f  file.  */.    co
2fa00 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
2fa10 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
2fa20 74 65 72 28 7a 50 61 74 68 2c 20 22 6d 6f 64 65  ter(zPath, "mode
2fa30 6f 66 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 20  of");.    if( z 
2fa40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
2fa50 74 46 69 6c 65 4d 6f 64 65 28 7a 2c 20 70 4d 6f  tFileMode(z, pMo
2fa60 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b  de, pUid, pGid);
2fa70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2fa80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fa90 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
2faa0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
2fab0 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
2fac0 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
2fad0 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
2fae0 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
2faf0 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
2fb00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2fb10 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
2fb20 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2fb30 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
2fb40 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2fb50 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
2fb60 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
2fb70 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
2fb80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
2fb90 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
2fba0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
2fbb0 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
2fbc0 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
2fbd0 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
2fbe0 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
2fbf0 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
2fc00 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
2fc10 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
2fc20 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
2fc30 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
2fc40 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
2fc50 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
2fc60 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
2fc70 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
2fc80 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
2fc90 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
2fca0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
2fcb0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
2fcc0 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
2fcd0 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
2fce0 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
2fcf0 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
2fd00 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
2fd10 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
2fd20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
2fd30 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
2fd40 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
2fd50 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
2fd60 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
2fd70 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
2fd80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2fd90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2fda0 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
2fdb0 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
2fdc0 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
2fdd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2fde0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
2fdf0 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
2fe00 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
2fe10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2fe20 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
2fe30 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
2fe40 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
2fe50 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
2fe60 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2fe70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
2fe80 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
2fe90 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
2fea0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
2feb0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2fec0 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
2fed0 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
2fee0 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
2fef0 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
2ff00 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
2ff10 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
2ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff30 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2ff40 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
2ff50 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
2ff60 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
2ff70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ff80 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
2ff90 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2ffa0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
2ffb0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
2ffc0 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
2ffd0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
2ffe0 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2fff0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30000 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
30010 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
30020 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30030 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
30040 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
30050 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   Code */.  int c
30060 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  trlFlags = 0;   
30070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49            /* UNI
30080 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
30090 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
300a0 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
300b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
300c0 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
300d0 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
300e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
300f0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
30100 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
30110 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
30120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
30130 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
30140 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
30150 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
30160 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
30170 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
30180 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
30190 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
301a0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
301b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
301c0 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
301d0 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
301e0 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
301f0 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
30200 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
30210 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
30220 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
30230 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
30240 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
30250 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
30260 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
30270 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
30280 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
30290 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
302a0 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
302b0 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
302c0 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
302d0 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
302e0 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
302f0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
30300 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
30310 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
30320 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
30330 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
30340 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  r = (isCreate &&
30350 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
30360 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
30370 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
30380 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
30390 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
303a0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
303b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
303c0 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
303d0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
303e0 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
303f0 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
30400 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
30410 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
30420 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
30430 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
30440 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
30450 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
30460 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
30470 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
30480 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30490 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
304a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
304b0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
304c0 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
304d0 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
304e0 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
304f0 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
30500 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
30510 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
30520 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
30530 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
30540 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
30550 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
30560 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
30570 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
30580 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
30590 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
305a0 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
305b0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
305c0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
305d0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
305e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
305f0 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
30600 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
30610 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
30620 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
30630 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
30640 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
30650 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
30660 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
30670 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
30680 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
30690 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
306a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
306b0 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
306c0 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
306d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
306e0 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
306f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
30700 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
30710 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
30720 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
30730 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
30740 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
30750 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
30760 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
30770 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
30780 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
30790 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
307a0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
307b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
307c0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
307d0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
307e0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
307f0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
30800 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
30810 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
30820 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
30830 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
30840 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
30850 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
30860 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
30870 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
30880 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
30890 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
308a0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
308b0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
308c0 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
308d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
308e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
308f0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
30900 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
30910 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
30920 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30930 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
30940 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30950 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
30960 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
30970 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30980 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
30990 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
309a0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
309b0 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70  .  /* Detect a p
309c0 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65  id change and re
309d0 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54  set the PRNG.  T
309e0 68 65 72 65 20 69 73 20 61 20 72 61 63 65 20 63  here is a race c
309f0 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65  ondition.  ** he
30a00 72 65 20 73 75 63 68 20 74 68 61 74 20 74 77 6f  re such that two
30a10 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73   or more threads
30a20 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f   all trying to o
30a30 70 65 6e 20 64 61 74 61 62 61 73 65 73 20 61 74  pen databases at
30a40 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69  .  ** the same i
30a50 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c  nstant might all
30a60 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
30a70 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72    But multiple r
30a80 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68  esets.  ** are h
30a90 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
30aa0 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  if( randomnessPi
30ab0 64 21 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29  d!=osGetpid(0) )
30ac0 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73  {.    randomness
30ad0 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30  Pid = osGetpid(0
30ae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
30af0 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
30b00 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c    }..  memset(p,
30b10 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
30b20 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
30b30 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
30b40 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
30b50 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
30b60 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
30b70 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
30b80 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
30b90 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
30ba0 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
30bb0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
30bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
30bd0 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
30be0 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66  _malloc64(sizeof
30bf0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
30c00 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
30c10 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
30c20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
30c30 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
30c40 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c   }.    p->pPreal
30c50 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20  locatedUnused = 
30c60 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a  pUnused;..    /*
30c70 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
30c80 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
30c90 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
30ca0 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
30cb0 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20     ** URIs with 
30cc0 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
30cd0 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
30ce0 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
30cf0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
30d00 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
30d10 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
30d20 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
30d30 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a  E_OPEN_URI) || z
30d40 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d  Name[strlen(zNam
30d50 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d  e)+1]==0 );..  }
30d60 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20  else if( !zName 
30d70 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  ){.    /* If zNa
30d80 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  me is NULL, the 
30d90 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72  upper layer is r
30da0 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70  equesting a temp
30db0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
30dc0 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
30dd0 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20   !syncDir);.    
30de0 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70  rc = unixGetTemp
30df0 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74  name(pVfs->mxPat
30e00 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29  hname, zTmpname)
30e10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30e20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30e40 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
30e50 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20  mpname;..    /* 
30e60 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72  Generated tempor
30e70 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ary filenames ar
30e80 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d  e always double-
30e90 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a  zero terminated.
30ea0 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62      ** for use b
30eb0 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  y sqlite3_uri_pa
30ec0 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
30ed0 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b    assert( zName[
30ee0 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
30ef0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
30f00 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
30f10 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
30f20 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
30f30 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
30f40 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
30f50 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
30f60 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
30f70 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
30f80 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
30f90 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
30fa0 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
30fb0 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
30fc0 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
30fd0 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
30fe0 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
30ff0 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
31000 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
31010 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
31020 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
31030 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
31040 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
31050 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
31060 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
31070 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
31080 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
31090 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
310a0 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
310b0 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
310c0 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
310d0 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
310e0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
310f0 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b  mode_t openMode;
31100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31110 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
31120 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68  create file with
31130 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69   */.    uid_t ui
31140 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31150 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
31160 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
31170 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20      gid_t gid;  
31180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31190 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72    /* Groupid for
311a0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
311b0 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
311c0 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
311d0 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
311e0 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20  , &uid, &gid);. 
311f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
31210 73 65 72 74 28 20 21 70 2d 3e 70 50 72 65 61 6c  sert( !p->pPreal
31220 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29 3b  locatedUnused );
31230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
31240 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
31250 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
31260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31270 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
31280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31290 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
312a0 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
312b0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
312c0 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
312d0 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
312e0 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
312f0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
31300 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
31310 69 73 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28  isExclusive || (
31320 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52  openFlags & O_CR
31330 45 41 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69  EAT)!=0 );.    i
31340 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
31350 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
31360 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
31370 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
31380 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
31390 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
313a0 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
313b0 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
313c0 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
313d0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
313e0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
313f0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
31400 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
31410 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
31420 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
31430 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
31440 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
31450 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69  _RDONLY;.      i
31460 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
31470 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
31480 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
31490 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
314a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
314b0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72   fd<0 ){.      r
314c0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
314d0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
314e0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
314f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
31500 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
31510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
31520 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
31530 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
31540 74 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e  t and if creatin
31550 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b  g a new rollback
31560 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
31570 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74  or WAL file, set
31580 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f   the ownership o
31590 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  f the journal or
315a0 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a   WAL to be.    *
315b0 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  * the same as th
315c0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
315d0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
315e0 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
315f0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
31600 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
31610 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  URNAL) ){.      
31620 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 66 64 2c  robustFchown(fd,
31630 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20   uid, gid);.    
31640 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
31650 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
31660 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
31670 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
31680 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
31690 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
316a0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
316b0 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
316c0 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
316d0 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74    p->pPreallocat
316e0 65 64 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  edUnused->flags 
316f0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
31700 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
31710 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
31720 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
31730 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
31740 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46  SQLITE_UNLINK_AF
31750 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a  TER_CLOSE).    z
31760 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Path = sqlite3_m
31770 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61  printf("%s", zNa
31780 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  me);.    if( zPa
31790 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  th==0 ){.      r
317a0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
317b0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
317c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
317d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
317e0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73    }.#else.    os
317f0 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  Unlink(zName);.#
31800 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
31810 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
31820 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
31830 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
31840 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
31850 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69    }.#endif.  .#i
31860 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
31870 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
31880 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
31890 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66  YLE.  if( fstatf
318a0 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
318b0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72  = -1 ){.    stor
318c0 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72  eLastErrno(p, er
318d0 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74  rno);.    robust
318e0 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
318f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74  LINE__);.    ret
31900 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
31910 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
31920 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
31930 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
31940 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
31950 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
31960 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
31970 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
31980 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
31990 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
319a0 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20  trncmp("exfat", 
319b0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
319c0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
319d0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
319e0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
319f0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
31a00 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
31a10 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61  f..  /* Set up a
31a20 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46  ppropriate ctrlF
31a30 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73  lags */.  if( is
31a40 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20 20  Delete )        
31a50 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
31a60 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
31a70 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65  LETE;.  if( isRe
31a80 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20  adonly )        
31a90 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
31aa0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  |= UNIXFILE_RDON
31ab0 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  LY;.  noLock = e
31ac0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
31ad0 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20 20 69 66 28  N_MAIN_DB;.  if(
31ae0 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20   noLock )       
31af0 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
31b00 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
31b10 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73  _NOLOCK;.  if( s
31b20 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20  yncDir )        
31b30 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
31b40 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
31b50 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c  IRSYNC;.  if( fl
31b60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
31b70 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67  N_URI ) ctrlFlag
31b80 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52  s |= UNIXFILE_UR
31b90 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  I;..#if SQLITE_E
31ba0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
31bb0 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
31bc0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
31bd0 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
31be0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
31bf0 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
31c00 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
31c10 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
31c20 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
31c30 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
31c40 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
31c50 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
31c60 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
31c70 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
31c80 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
31c90 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
31ca0 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
31cb0 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
31cc0 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
31cd0 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
31ce0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
31cf0 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
31d00 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
31d10 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
31d20 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
31d30 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
31d40 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
31d50 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
31d60 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
31d70 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
31d80 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
31d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
31da0 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
31db0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
31dc0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
31dd0 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
31de0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
31df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
31e10 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
31e20 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
31e30 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
31e40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
31e70 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
31e80 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
31e90 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
31ea0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
31eb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
31ec0 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
31ed0 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
31ee0 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
31ef0 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
31f00 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
31f10 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
31f20 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
31f30 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
31f40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
31f50 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
31f60 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
31f70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f90 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
31fa0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
31fb0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
31fc0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
31fd0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
31fe0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
31ff0 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f  rlFlags);..open_
32000 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
32010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32020 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
32030 65 28 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  e(p->pPreallocat
32040 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  edUnused);.  }. 
32050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
32060 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
32070 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
32080 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
32090 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
320a0 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
320b0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
320c0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
320d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
320e0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
320f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
32100 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
32110 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
32120 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
32130 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
32140 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
32150 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
32160 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
32170 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
32180 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
32190 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
321a0 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
321b0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
321c0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
321d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
321e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
321f0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
32200 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
32210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
32220 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
32230 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
32240 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
32250 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
32260 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
32270 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
32280 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
32290 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
322a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
322b0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
322c0 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
322d0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
322e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
322f0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
32300 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
32310 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
32320 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
32330 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
32340 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
32350 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
32360 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
32370 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
32380 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
32390 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
323a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
323b0 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28   if( full_fsync(
323c0 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
323d0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
323e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
323f0 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
32400 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
32410 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
32420 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
32430 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
32440 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
32450 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  rt( rc==SQLITE_C
32460 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ANTOPEN );.     
32470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32480 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
32490 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
324a0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
324b0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72   existence of or
324c0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
324d0 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
324e0 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
324f0 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
32500 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
32510 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
32520 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
32530 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
32540 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
32550 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
32560 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
32570 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
32580 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
32590 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
325a0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
325b0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
325c0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
325d0 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
325e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
325f0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
32600 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
32610 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
32620 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
32630 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
32640 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
32650 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
32660 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
32670 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
32680 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
32690 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
326a0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
326b0 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
326c0 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
326d0 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
326e0 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
326f0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
32700 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
32710 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
32720 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
32730 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32740 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
32750 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
32760 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
32770 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
32780 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Out!=0 );..  /* 
32790 54 68 65 20 73 70 65 63 20 73 61 79 73 20 74 68  The spec says th
327a0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 70 6f  ere are three po
327b0 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f  ssible values fo
327c0 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e  r flags.  But on
327d0 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74  ly.  ** two of t
327e0 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hem are actually
327f0 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72   used */.  asser
32800 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  t( flags==SQLITE
32810 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c  _ACCESS_EXISTS |
32820 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  | flags==SQLITE_
32830 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
32840 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   );..  if( flags
32850 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
32860 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74  EXISTS ){.    st
32870 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
32880 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30     *pResOut = (0
32890 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
328a0 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f  &buf) && buf.st_
328b0 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65  size>0);.  }else
328c0 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
328d0 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c   osAccess(zPath,
328e0 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a   W_OK|R_OK)==0;.
328f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
32900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
32920 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  kFullPathname(. 
32930 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
32940 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
32950 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a   /* Input path *
32960 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20  /.  char *zOut, 
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32980 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
32990 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ffer */.  int nO
329a0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
329b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
329c0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62  ocated size of b
329d0 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b  uffer zOut */.){
329e0 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73  .  int nPath = s
329f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
32a00 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66  Path);.  int iOf
32a10 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61  f = 0;.  if( zPa
32a20 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  th[0]!='/' ){.  
32a30 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
32a40 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20  Out, nOut-2)==0 
32a50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
32a60 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
32a70 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
32a80 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
32a90 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  th);.    }.    i
32aa0 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Off = sqlite3Str
32ab0 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20  len30(zOut);.   
32ac0 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20   zOut[iOff++] = 
32ad0 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  '/';.  }.  if( (
32ae0 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f  iOff+nPath+1)>nO
32af0 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ut ){.    /* SQL
32b00 69 74 65 20 61 73 73 75 6d 65 73 20 74 68 61 74  ite assumes that
32b10 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29   xFullPathname()
32b20 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20   nul-terminates 
32b30 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
32b40 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66  r.    ** even if
32b50 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65   it returns an e
32b60 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f  rror.  */.    zO
32b70 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b  ut[iOff] = '\0';
32b80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
32b90 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
32ba0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
32bb0 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f  snprintf(nOut-iO
32bc0 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c  ff, &zOut[iOff],
32bd0 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20   "%s", zPath);. 
32be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32bf0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  K;.}../*.** Turn
32c00 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
32c10 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
32c20 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
32c30 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
32c40 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
32c50 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
32c60 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
32c70 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
32c80 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
32c90 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
32ca0 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
32cb0 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
32cc0 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
32cd0 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
32ce0 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
32cf0 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
32d00 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
32d10 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
32d20 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
32d30 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
32d40 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
32d50 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
32d60 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
32d70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
32d80 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
32d90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
32da0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
32db0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
32dc0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
32dd0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
32de0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
32df0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
32e00 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
32e10 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
32e20 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
32e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
32e40 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
32e50 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
32e60 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c  HAVE_READLINK) |
32e70 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | !defined(HAVE_
32e80 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20  LSTAT).  return 
32e90 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  mkFullPathname(z
32ea0 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74  Path, zOut, nOut
32eb0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  );.#else.  int r
32ec0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32ed0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
32ee0 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20  t nLink = 1;    
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32f00 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69  umber of symboli
32f10 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64  c links followed
32f20 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e   so far */.  con
32f30 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a  st char *zIn = z
32f40 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Path;      /* In
32f50 70 75 74 20 70 61 74 68 20 66 6f 72 20 65 61 63  put path for eac
32f60 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c  h iteration of l
32f70 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  oop */.  char *z
32f80 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Del = 0;..  asse
32f90 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
32fa0 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41  name==MAX_PATHNA
32fb0 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ME );.  UNUSED_P
32fc0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
32fd0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
32fe0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
32ff0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
33000 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
33010 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
33020 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
33030 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
33040 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
33050 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
33060 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
33070 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
33080 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
33090 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
330a0 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
330b0 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
330c0 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
330d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
330e0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
330f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
33100 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20  );..  do {..    
33110 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f  /* Call stat() o
33120 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20  n path zIn. Set 
33130 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66  bLink to true if
33140 20 74 68 65 20 70 61 74 68 20 69 73 20 61 20 73   the path is a s
33150 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c  ymbolic.    ** l
33160 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ink, or false ot
33170 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20  herwise.  */.   
33180 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a   int bLink = 0;.
33190 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
331a0 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c  buf;.    if( osL
331b0 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21  stat(zIn, &buf)!
331c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
331d0 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
331e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
331f0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
33200 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
33210 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a   "lstat", zIn);.
33220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
33230 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d  e{.      bLink =
33240 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f   S_ISLNK(buf.st_
33250 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  mode);.    }..  
33260 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20    if( bLink ){. 
33270 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30       if( zDel==0
33280 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c   ){.        zDel
33290 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
332a0 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  c(nOut);.       
332b0 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72   if( zDel==0 ) r
332c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
332d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
332e0 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53  se if( ++nLink>S
332f0 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e  QLITE_MAX_SYMLIN
33300 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  KS ){.        rc
33310 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
33320 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EN_BKPT;.      }
33330 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
33340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33350 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52       nByte = osR
33360 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65  eadlink(zIn, zDe
33370 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20  l, nOut-1);.    
33380 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20      if( nByte<0 
33390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
333a0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
333b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
333c0 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c  KPT, "readlink",
333d0 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d   zIn);.        }
333e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
333f0 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27  if( zDel[0]!='/'
33400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33410 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
33420 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74     for(n = sqlit
33430 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b  e3Strlen30(zIn);
33440 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d   n>0 && zIn[n-1]
33450 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20  !='/'; n--);.   
33460 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79           if( nBy
33470 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20  te+n+1>nOut ){. 
33480 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
33490 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
334a0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
334b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
334c0 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
334d0 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c  (&zDel[n], zDel,
334e0 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20   nByte+1);.     
334f0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
33500 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20  zDel, zIn, n);. 
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
33520 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  te += n;.       
33530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33540 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65   }.          zDe
33550 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b  l[nByte] = '\0';
33560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33570 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20   }..      zIn = 
33580 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  zDel;.    }..   
33590 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
335a0 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a  ITE_OK || zIn!=z
335b0 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27  Out || zIn[0]=='
335c0 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  /' );.    if( rc
335d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
335e0 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20  In!=zOut ){.    
335f0 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74    rc = mkFullPat
33600 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c  hname(zIn, zOut,
33610 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20   nOut);.    }.  
33620 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29    if( bLink==0 )
33630 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20   break;.    zIn 
33640 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65  = zOut;.  }while
33650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33660 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
33670 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75  ee(zDel);.  retu
33680 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20  rn rc;.#endif   
33690 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b  /* HAVE_READLINK
336a0 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a   && HAVE_LSTAT *
336b0 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  /.}...#ifndef SQ
336c0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
336d0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
336e0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
336f0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
33700 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
33710 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
33720 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
33730 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
33740 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
33750 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
33760 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
33770 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
33780 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
33790 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
337a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
337b0 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
337c0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
337d0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
337e0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
337f0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
33800 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
33810 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
33820 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
33830 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
33840 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
33850 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
33860 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
33870 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
33880 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
33890 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
338a0 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
338b0 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
338c0 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
338d0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
338e0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
338f0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
33900 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
33910 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
33920 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
33930 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
33940 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
33950 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
33960 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33970 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
33980 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
33990 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
339a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
339b0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
339c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
339d0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
339e0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
339f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
33a00 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
33a10 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
33a20 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
33a30 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
33a40 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
33a50 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
33a60 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
33a70 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
33a80 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
33a90 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
33aa0 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
33ab0 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
33ac0 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
33ad0 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
33ae0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
33af0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
33b00 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
33b10 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
33b20 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
33b30 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
33b40 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
33b50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
33b60 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
33b70 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
33b80 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
33b90 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
33ba0 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
33bb0 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
33bc0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
33bd0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
33be0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
33bf0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
33c00 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
33c10 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
33c20 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
33c30 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
33c40 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
33c50 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
33c60 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
33c70 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
33c80 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
33c90 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
33ca0 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
33cb0 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
33cc0 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
33cd0 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
33ce0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
33cf0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
33d00 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
33d10 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
33d20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
33d30 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
33d40 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
33d50 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
33d60 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
33d70 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
33d80 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
33d90 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
33da0 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
33db0 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
33dc0 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
33dd0 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
33de0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
33df0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
33e00 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
33e10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33e20 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
33e30 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
33e40 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
33e50 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
33e60 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
33e70 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
33e80 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
33e90 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33ea0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
33eb0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
33ec0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33ed0 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
33ee0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
33ef0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
33f00 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
33f10 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
33f20 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
33f30 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
33f40 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
33f50 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
33f60 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
33f70 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
33f80 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
33f90 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
33fa0 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
33fb0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
33fc0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
33fd0 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
33fe0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
33ff0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
34000 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
34010 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34020 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
34030 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
34040 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
34050 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
34060 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
34070 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
34080 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
34090 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
340a0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
340b0 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
340c0 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
340d0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
340e0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
340f0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
34100 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
34110 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
34120 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
34130 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
34140 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
34150 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
34160 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
34170 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
34180 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
34190 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
341a0 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
341b0 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
341c0 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
341d0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
341e0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
341f0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
34200 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
34210 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
34220 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
34230 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
34240 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
34250 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
34260 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
34270 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
34280 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
34290 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
342a0 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
342b0 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
342c0 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
342d0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
342e0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
342f0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
34300 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a   osGetpid(0);  .
34310 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
34320 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
34330 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
34340 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20  T_RANDOMNESS).  
34350 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f  {.    int fd, go
34360 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
34370 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
34380 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
34390 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
343a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
343b0 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
343c0 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
343d0 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
343e0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d  eof(t));.      m
343f0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
34400 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e  of(t)], &randomn
34410 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72  essPid, sizeof(r
34420 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a  andomnessPid));.
34430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
34440 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72  zeof(t)+sizeof(r
34450 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28  andomnessPid)<=(
34460 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
34470 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
34480 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72  of(t) + sizeof(r
34490 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20  andomnessPid);. 
344a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
344b0 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64  do{ got = osRead
344c0 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
344d0 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
344e0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
344f0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
34500 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
34510 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
34520 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
34530 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
34540 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
34550 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
34560 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
34570 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
34580 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
34590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
345a0 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
345b0 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
345c0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
345d0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
345e0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
345f0 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
34600 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
34610 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
34620 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
34630 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
34640 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
34650 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
34660 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
34670 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
34680 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
34690 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
346a0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
346b0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
346c0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
346d0 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
346e0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
346f0 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
34700 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
34710 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
34720 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
34730 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
34740 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
34750 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
34760 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
34770 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34780 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
34790 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
347a0 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
347b0 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
347c0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
347d0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
347e0 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
347f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
34800 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
34810 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
34820 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
34830 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
34840 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
34850 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
34860 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34870 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
34880 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
34890 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
348a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
348b0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
348c0 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
348d0 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
348e0 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
348f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
34900 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
34910 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
34920 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
34930 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
34940 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
34950 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
34960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
34970 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
34980 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
34990 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
349a0 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
349b0 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
349c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
349d0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
349e0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
349f0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
34a00 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
34a10 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
34a20 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
34a30 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
34a40 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
34a50 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
34a60 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
34a70 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
34a80 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
34a90 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
34aa0 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
34ab0 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
34ac0 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
34ad0 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
34ae0 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
34af0 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
34b00 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
34b10 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
34b20 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
34b30 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
34b40 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
34b50 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
34b60 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
34b70 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
34b80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
34b90 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
34ba0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
34bb0 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
34bc0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
34bd0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
34be0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
34bf0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
34c00 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
34c10 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  000;.  int rc = 
34c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64  SQLITE_OK;.#if d
34c30 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44  efined(NO_GETTOD
34c40 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
34c50 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e  time(&t);.  *piN
34c60 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  ow = ((sqlite3_i
34c70 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75  nt64)t)*1000 + u
34c80 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20  nixEpoch;.#elif 
34c90 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
34ca0 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
34cb0 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
34cc0 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
34cd0 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69  E, &sNow);.  *pi
34ce0 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
34cf0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
34d00 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
34d10 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  c + sNow.tv_nsec
34d20 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a  /1000000;.#else.
34d30 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
34d40 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67   sNow;.  (void)g
34d50 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
34d60 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  w, 0);  /* Canno
34d70 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c  t fail given val
34d80 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  id arguments */.
34d90 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
34da0 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
34db0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
34dc0 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
34dd0 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
34de0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
34df0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
34e00 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
34e10 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
34e20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
34e30 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
34e40 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
34e50 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
34e60 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
34e70 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
34e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34ea0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
34eb0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
34ec0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
34ed0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
34ee0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
34ef0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
34f00 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
34f10 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
34f20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
34f30 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
34f40 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
34f50 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
34f60 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
34f70 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
34f80 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
34f90 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
34fa0 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
34fb0 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
34fc0 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20  3_int64 i = 0;. 
34fd0 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45   int rc;.  UNUSE
34fe0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
34ff0 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69  sed);.  rc = uni
35000 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
35010 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
35020 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
35030 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
35040 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
35050 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
35060 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
35070 20 54 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   The xGetLastErr
35080 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64  or() method is d
35090 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72  esigned to retur
350a0 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f  n a better.** lo
350b0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
350c0 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61  ssage when opera
350d0 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
350e0 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
350f0 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
35100 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74  eration.  Only t
35110 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
35120 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e  n code is curren
35130 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a  tly.** used..*/.
35140 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
35150 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
35160 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
35170 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
35180 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
35190 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
351a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
351b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
351c0 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
351d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
351e0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
351f0 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a  rn errno;.}.../*
35200 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
35210 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
35220 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
35230 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
35240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35250 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
35260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
352a0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
352b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
35300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
35310 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
35320 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
35330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35340 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
35350 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
35360 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
35370 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
35380 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
35390 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
353a0 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
353b0 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
353c0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
353d0 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
353e0 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
353f0 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
35400 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
35410 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
35420 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
35430 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
35440 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
35450 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
35460 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
35470 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
35480 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
35490 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
354a0 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
354b0 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
354c0 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
354d0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
354e0 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
354f0 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
35500 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
35510 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
35520 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
35530 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
35540 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
35550 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
35560 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
35570 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
35580 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
35590 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
355a0 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
355b0 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
355c0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
355d0 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
355e0 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
355f0 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
35600 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
35610 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
35620 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
35630 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
35640 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
35650 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
35660 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
35670 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
35680 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
35690 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
356a0 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
356b0 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
356c0 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
356d0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
356e0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
356f0 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
35700 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
35710 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
35720 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
35730 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
35740 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
35750 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
35760 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
35770 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
35780 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
35790 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
357a0 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
357b0 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
357c0 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
357d0 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
357e0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
357f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
35800 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
35810 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
35820 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20    0x40000000.** 
35830 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
35840 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
35850 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
35860 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
35870 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
35880 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
35890 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
358a0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
358b0 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
358c0 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
358d0 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
358e0 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
358f0 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
35900 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
35910 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
35920 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
35930 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
35940 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
35950 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
35960 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
35970 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
35980 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
35990 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
359a0 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
359b0 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
359c0 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
359d0 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
359e0 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
359f0 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
35a00 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
35a10 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
35a20 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
35a30 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
35a40 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
35a50 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
35a60 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
35a70 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
35a80 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
35a90 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
35aa0 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
35ab0 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
35ac0 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
35ad0 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
35ae0 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
35af0 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
35b00 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
35b10 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
35b20 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
35b30 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
35b40 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
35b50 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
35b60 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
35b70 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
35b80 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
35b90 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
35ba0 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
35bb0 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
35bc0 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
35bd0 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
35be0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
35bf0 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
35c00 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
35c10 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
35c20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
35c30 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
35c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c50 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
35c60 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
35c70 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
35c80 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
35c90 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
35ca0 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cc0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
35cd0 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
35ce0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
35cf0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
35d00 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
35d10 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
35d20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
35d30 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f          &<proxy_
35d40 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
35d50 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
35d60 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
35d70 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
35d80 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
35d90 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
35da0 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
35db0 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
35dc0 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
35dd0 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
35de0 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
35df0 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
35e00 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
35e10 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
35e20 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
35e30 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
35e40 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
35e50 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
35e60 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
35e70 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
35e80 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
35e90 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
35ea0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
35eb0 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
35ec0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
35ed0 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
35ee0 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
35ef0 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
35f00 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
35f10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
35f20 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
35f30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
35f40 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
35f50 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
35f60 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
35f70 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
35f80 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
35f90 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
35fa0 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
35fb0 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
35fc0 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
35fd0 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
35fe0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
35ff0 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
36000 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
36010 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
36020 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
36030 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
36040 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
36050 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
36060 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
36070 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
36080 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
36090 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
360a0 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
360b0 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
360c0 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
360d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
360e0 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
360f0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
36100 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
36110 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
36120 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
36130 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
36140 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
36150 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
36160 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
36170 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
36180 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
36190 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
361a0 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
361b0 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
361c0 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
361d0 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
361e0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
361f0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
36200 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
36210 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
36220 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
36230 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
36240 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
36250 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
36260 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
36270 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
36280 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
36290 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
362a0 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
362b0 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
362c0 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
362d0 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
362e0 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
362f0 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
36300 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
36310 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
36320 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
36330 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
36340 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36350 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
36360 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
36370 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
36380 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
36390 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
363a0 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
363b0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
363c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
363d0 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  or its contents 
363e0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
363f0 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
36400 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
36410 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
36420 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
36430 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
36440 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
36450 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
36460 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
36470 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
36480 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
36490 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
364a0 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
364b0 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
364c0 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
364d0 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
364e0 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
364f0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
36500 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
36510 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
36520 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
36530 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
36540 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
36550 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
36560 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
36570 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
36580 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
36590 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
365a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
365b0 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
365c0 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
365d0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
365e0 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
365f0 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
36600 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
36610 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
36620 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
36630 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
36640 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
36650 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
36660 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
36670 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
36680 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
36690 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
366a0 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
366b0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
366c0 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
366d0 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
366e0 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
366f0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
36700 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
36710 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
36720 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
36730 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
36740 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
36750 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
36760 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
36770 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
36780 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
36790 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
367a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
367b0 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
367c0 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
367d0 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
367e0 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
367f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
36800 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
36810 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
36820 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
36830 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
36840 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
36850 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
36860 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
36870 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
36880 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
36890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
368a0 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
368b0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
368c0 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
368d0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
368e0 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
368f0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
36900 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
36910 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
36920 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
36930 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
36940 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
36950 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
36960 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
36970 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
36980 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
36990 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
369a0 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
369b0 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
369c0 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
369d0 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
369e0 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
369f0 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
36a00 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
36a10 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
36a20 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
36a30 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
36a40 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
36a50 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
36a60 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
36a70 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
36a80 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
36a90 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
36aa0 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
36ab0 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
36ac0 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
36ad0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
36ae0 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
36af0 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
36b00 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
36b10 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
36b20 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
36b30 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
36b40 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
36b50 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
36b60 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
36b70 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
36b80 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
36b90 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
36ba0 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
36bb0 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
36bc0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
36bd0 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
36be0 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
36bf0 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
36c00 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
36c10 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
36c20 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
36c30 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
36c40 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
36c50 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
36c60 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
36c70 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
36c80 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
36c90 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
36ca0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
36cb0 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c  (explicitly call
36cc0 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46  ing the SQLITE_F
36cd0 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
36ce0 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
36cf0 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
36d00 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
36d10 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
36d20 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
36d30 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
36d40 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
36d50 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
36d60 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
36d70 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
36d80 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
36d90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
36da0 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
36db0 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
36dc0 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
36dd0 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
36de0 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
36df0 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
36e00 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
36e10 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
36e20 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
36e30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
36e40 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
36e50 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
36e60 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
36e70 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
36e80 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
36e90 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
36ea0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
36eb0 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
36ec0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
36ed0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
36ee0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
36ef0 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
36f00 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
36f10 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
36f20 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
36f30 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
36f40 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
36f50 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
36f60 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
36f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36f80 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
36f90 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
36fa0 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
36fb0 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
36fc0 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
36fd0 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
36fe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73   */.  int nFails
36ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37000 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37010 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69  conch taking fai
37020 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
37030 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  *oldLockingConte
37040 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  xt;     /* Origi
37050 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65  nal lockingconte
37060 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e  xt to restore on
37070 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69   close */.  sqli
37080 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
37090 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64  onst *pOldMethod
370a0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
370b0 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f  l I/O methods fo
370c0 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  r close */.};../
370d0 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  * .** The proxy 
370e0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66  lock file path f
370f0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
37100 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69  at dbPath is wri
37110 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c  tten into lPath,
37120 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20   .** which must 
37130 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20  point to valid, 
37140 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20  writable memory 
37150 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
37160 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68   a maxLen length
37170 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a  .** file path. .
37180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
37190 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63  oxyGetLockPath(c
371a0 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
371b0 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20  h, char *lPath, 
371c0 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a  size_t maxLen){.
371d0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
371e0 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b   dbLen;.  int i;
371f0 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f  ..#ifdef LOCKPRO
37200 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74  XYDIR.  len = st
37210 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43  rlcpy(lPath, LOC
37220 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65  KPROXYDIR, maxLe
37230 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65  n);.#else.# ifde
37240 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  f _CS_DARWIN_USE
37250 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20  R_TEMP_DIR.  {. 
37260 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28     if( !confstr(
37270 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
37280 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c  TEMP_DIR, lPath,
37290 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20   maxLen) ){.    
372a0 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
372b0 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20  OCKPATH  failed 
372c0 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d  %s errno=%d pid=
372d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
372e0 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72        lPath, err
372f0 6e 6f 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  no, osGetpid(0))
37300 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
37310 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
37320 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  K;.    }.    len
37330 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
37340 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22  , "sqliteplocks"
37350 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20  , maxLen);    . 
37360 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20   }.# else.  len 
37370 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
37380 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e   "/tmp/", maxLen
37390 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  );.# endif.#endi
373a0 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c  f..  if( lPath[l
373b0 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  en-1]!='/' ){.  
373c0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
373d0 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c  lPath, "/", maxL
373e0 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  en);.  }.  .  /*
373f0 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64   transform the d
37400 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71  b path to a uniq
37410 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f  ue cache name */
37420 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29  .  dbLen = (int)
37430 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a  strlen(dbPath);.
37440 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62    for( i=0; i<db
37450 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29  Len && (i+len+7)
37460 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b  <(int)maxLen; i+
37470 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  +){.    char c =
37480 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20   dbPath[i];.    
37490 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28  lPath[i+len] = (
374a0 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20  c=='/')?'_':c;. 
374b0 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e   }.  lPath[i+len
374c0 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61  ]='\0';.  strlca
374d0 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a  t(lPath, ":auto:
374e0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53  ", maxLen);.  OS
374f0 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
37500 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
37510 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
37520 22 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70  ", lPath, osGetp
37530 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72  id(0)));.  retur
37540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
37550 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
37560 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
37570 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
37580 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
37590 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
375a0 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
375b0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
375c0 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
375d0 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
375e0 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
375f0 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
37600 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
37610 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
37620 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
37630 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
37640 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
37650 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
37660 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
37670 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
37680 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
37690 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
376a0 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
376b0 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
376c0 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
376d0 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
376e0 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
376f0 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
37700 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
37710 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
37720 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
37730 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
37740 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
37750 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
37760 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
37770 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
37780 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
37790 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
377a0 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
377b0 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
377c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73  ;.        if( os
377d0 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  Mkdir(buf, SQLIT
377e0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
377f0 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
37800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
37810 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
37820 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
37830 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
37840 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
37850 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
37860 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
37870 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
37880 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
37890 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
378a0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
378b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378c0 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
378d0 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
378e0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
378f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
37900 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20  urn err;.       
37910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
37920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
37930 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  rt=i+1;.    }.  
37940 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50    buf[i] = lockP
37950 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53  ath[i];.  }.  OS
37960 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
37970 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
37980 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
37990 64 5c 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73  d\n",lockPath,os
379a0 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72  Getpid(0)));.  r
379b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
379c0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
379d0 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
379e0 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
379f0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
37a00 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
37a10 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
37a20 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
37a30 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
37a40 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
37a50 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
37a60 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
37a70 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
37a80 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
37a90 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
37aa0 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
37ab0 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
37ac0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
37ad0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
37ae0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37af0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
37b00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
37b10 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
37b20 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
37b30 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
37b40 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
37b50 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
37b60 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
37b70 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
37b80 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
37b90 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
37ba0 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
37bb0 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
37bc0 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
37bd0 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
37be0 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
37bf0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
37c00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37c10 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
37c20 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
37c30 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
37c40 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
37c50 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
37c60 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
37c70 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
37c80 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
37c90 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
37ca0 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
37cb0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
37cc0 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
37cd0 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
37ce0 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
37cf0 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
37d00 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
37d10 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
37d20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
37d30 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
37d40 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
37d50 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
37d60 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
37d70 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
37d80 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
37d90 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
37da0 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
37db0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
37dc0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
37dd0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
37de0 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
37df0 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
37e00 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
37e10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
37e20 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
37e30 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
37e40 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
37e50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
37e60 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
37e70 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
37e80 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
37e90 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
37ea0 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
37eb0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
37ec0 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
37ed0 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
37ee0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
37ef0 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
37f00 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
37f10 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
37f20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
37f30 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
37f40 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
37f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
37f60 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
37f70 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
37f80 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
37f90 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
37fa0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
37fb0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
37fc0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
37fd0 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
37fe0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
37ff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38000 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
38010 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
38020 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
38030 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
38040 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
38050 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
38060 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
38070 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
38080 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
38090 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
380a0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
380b0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
380c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
380d0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
380e0 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
380f0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
38100 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
38110 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
38120 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
38130 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
38140 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
38150 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
38160 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
38170 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
38180 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
38190 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
381a0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
381b0 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
381c0 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  Vfs, 0, sizeof(d
381d0 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d  ummyVfs));.  dum
381e0 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
381f0 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
38200 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d  kIoFinder;.  dum
38210 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64  myVfs.zName = "d
38220 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64  ummy";.  pUnused
38230 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
38240 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
38250 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
38260 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
38270 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
38280 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
38290 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56  UnixFile(&dummyV
382a0 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33  fs, fd, (sqlite3
382b0 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
382c0 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  h, 0);.  if( rc=
382d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
382e0 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
382f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
38300 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f  ITE_OK;.  }.end_
38310 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20  create_proxy:   
38320 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65   .  robust_close
38330 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e  (pNew, fd, __LIN
38340 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E__);.  sqlite3_
38350 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71  free(pNew);.  sq
38360 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
38370 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
38380 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
38390 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c  TE_TEST./* simul
383a0 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
383b0 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
383c0 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
383d0 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
383e0 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
383f0 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
38400 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
38410 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
38420 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
38430 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 23   id length */..#
38440 69 66 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f  ifdef HAVE_GETHO
38450 53 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20 61 6c  STUUID./* Not al
38460 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ways defined in 
38470 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69  the headers as i
38480 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f  t ought to be */
38490 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68  .extern int geth
384a0 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69  ostuuid(uuid_t i
384b0 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  d, const struct 
384c0 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b  timespec *wait);
384d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65 74 20  .#endif../* get 
384e0 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
384f0 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
38500 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
38510 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
38520 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
38530 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
38540 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
38550 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
38560 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
38570 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
38580 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50  ror){.  assert(P
38590 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
385a0 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
385b0 29 3b 0a 20 20 6d 65 6d