/ Hex Artifact Content
Login

Artifact 1ef4b733679ea62fa4b787dc33af95c28dca459c0a0e5cf815698104f63ceffa:


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: 54 75 72 6e 20 74 68 69 73 20 66 65 61 74 75 72  Turn this featur
0860: 65 20 6f 6e 20 69 6e 20 61 6c 6c 20 62 75 69 6c  e on in all buil
0870: 64 73 20 66 6f 72 20 6e 6f 77 20 2a 2f 0a 23 64  ds for now */.#d
0880: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54  efine SQLITE_MUT
0890: 45 58 46 52 45 45 5f 53 48 4d 4c 4f 43 4b 20 31  EXFREE_SHMLOCK 1
08a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ../*.** There ar
08b0: 65 20 76 61 72 69 6f 75 73 20 6d 65 74 68 6f 64  e various method
08c0: 73 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69  s for file locki
08d0: 6e 67 20 75 73 65 64 20 66 6f 72 20 63 6f 6e 63  ng used for conc
08e0: 75 72 72 65 6e 63 79 0a 2a 2a 20 63 6f 6e 74 72  urrency.** contr
08f0: 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50  ol:.**.**   1. P
0900: 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 28 74 68  OSIX locking (th
0910: 65 20 64 65 66 61 75 6c 74 29 2c 0a 2a 2a 20 20  e default),.**  
0920: 20 32 2e 20 4e 6f 20 6c 6f 63 6b 69 6e 67 2c 0a   2. No locking,.
0930: 2a 2a 20 20 20 33 2e 20 44 6f 74 2d 66 69 6c 65  **   3. Dot-file
0940: 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 34   locking,.**   4
0950: 2e 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  . flock() lockin
0960: 67 2c 0a 2a 2a 20 20 20 35 2e 20 41 46 50 20 6c  g,.**   5. AFP l
0970: 6f 63 6b 69 6e 67 20 28 4f 53 58 20 6f 6e 6c 79  ocking (OSX only
0980: 29 2c 0a 2a 2a 20 20 20 36 2e 20 4e 61 6d 65 64  ),.**   6. Named
0990: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
09a0: 73 20 28 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 29  s (VXWorks only)
09b0: 2c 0a 2a 2a 20 20 20 37 2e 20 70 72 6f 78 79 20  ,.**   7. proxy 
09c0: 6c 6f 63 6b 69 6e 67 2e 20 28 4f 53 58 20 6f 6e  locking. (OSX on
09d0: 6c 79 29 0a 2a 2a 0a 2a 2a 20 53 74 79 6c 65 73  ly).**.** Styles
09e0: 20 34 2c 20 35 2c 20 61 6e 64 20 37 20 61 72 65   4, 5, and 7 are
09f0: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
0a00: 6f 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  of SQLITE_ENABLE
0a10: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2a  _LOCKING_STYLE.*
0a20: 2a 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  * is defined to 
0a30: 31 2e 20 20 54 68 65 20 53 51 4c 49 54 45 5f 45  1.  The SQLITE_E
0a40: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a50: 59 4c 45 20 61 6c 73 6f 20 65 6e 61 62 6c 65 73  YLE also enables
0a60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 73 65   automatic.** se
0a70: 6c 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  lection of the a
0a80: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
0a90: 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20 6f  ng style based o
0aa0: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
0ab0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 64 61  .** where the da
0ac0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 61 74 65  tabase is locate
0ad0: 64 2e 20 20 0a 2a 2f 0a 23 69 66 20 21 64 65 66  d.  .*/.#if !def
0ae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0af0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0b00: 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28  ).#  if defined(
0b10: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20  __APPLE__).#    
0b20: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
0b30: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0b40: 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  LE 1.#  else.#  
0b50: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0b60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0b70: 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a  TYLE 0.#  endif.
0b80: 23 65 6e 64 69 66 0a 0a 2f 2a 20 55 73 65 20 70  #endif../* Use p
0b90: 72 65 61 64 28 29 20 61 6e 64 20 70 77 72 69 74  read() and pwrit
0ba0: 65 28 29 20 69 66 20 74 68 65 79 20 61 72 65 20  e() if they are 
0bb0: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 23 69 66  available */.#if
0bc0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
0bd0: 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 48 41 56  __).# define HAV
0be0: 45 5f 50 52 45 41 44 20 31 0a 23 20 64 65 66 69  E_PREAD 1.# defi
0bf0: 6e 65 20 48 41 56 45 5f 50 57 52 49 54 45 20 31  ne HAVE_PWRITE 1
0c00: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
0c10: 6e 65 64 28 48 41 56 45 5f 50 52 45 41 44 36 34  ned(HAVE_PREAD64
0c20: 29 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  ) && defined(HAV
0c30: 45 5f 50 57 52 49 54 45 36 34 29 0a 23 20 75 6e  E_PWRITE64).# un
0c40: 64 65 66 20 55 53 45 5f 50 52 45 41 44 0a 23 20  def USE_PREAD.# 
0c50: 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
0c60: 36 34 20 31 0a 23 65 6c 69 66 20 64 65 66 69 6e  64 1.#elif defin
0c70: 65 64 28 48 41 56 45 5f 50 52 45 41 44 29 20 26  ed(HAVE_PREAD) &
0c80: 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  & defined(HAVE_P
0c90: 57 52 49 54 45 29 0a 23 20 75 6e 64 65 66 20 55  WRITE).# undef U
0ca0: 53 45 5f 50 52 45 41 44 36 34 0a 23 20 64 65 66  SE_PREAD64.# def
0cb0: 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 31 0a  ine USE_PREAD 1.
0cc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74  #endif../*.** st
0cd0: 61 6e 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66  andard include f
0ce0: 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  iles..*/.#includ
0cf0: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
0d00: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
0d10: 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  at.h>.#include <
0d20: 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64  fcntl.h>.#includ
0d30: 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a  e <sys/ioctl.h>.
0d40: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
0d50: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
0d60: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
0d70: 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  sys/time.h>.#inc
0d80: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23  lude <errno.h>.#
0d90: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
0da0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
0db0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
0dc0: 53 49 5a 45 3e 30 0a 23 20 69 6e 63 6c 75 64 65  SIZE>0.# include
0dd0: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
0de0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
0df0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0e00: 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65 20  STYLE.# include 
0e10: 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20  <sys/ioctl.h>.# 
0e20: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c  include <sys/fil
0e30: 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  e.h>.# include <
0e40: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 65 6e  sys/param.h>.#en
0e50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
0e60: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0e70: 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  LE */..#if defin
0e80: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
0e90: 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45   ((__MAC_OS_X_VE
0ea0: 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52  RSION_MIN_REQUIR
0eb0: 45 44 20 3e 20 31 30 35 30 29 20 7c 7c 20 5c 0a  ED > 1050) || \.
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 20 20 20 20 20 20 20 20 28 5f 5f 49 50             (__IP
0ee0: 48 4f 4e 45 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f  HONE_OS_VERSION_
0ef0: 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20 32  MIN_REQUIRED > 2
0f00: 30 30 30 29 29 0a 23 20 20 69 66 20 28 21 64 65  000)).#  if (!de
0f10: 66 69 6e 65 64 28 54 41 52 47 45 54 5f 4f 53 5f  fined(TARGET_OS_
0f20: 45 4d 42 45 44 44 45 44 29 20 7c 7c 20 28 54 41  EMBEDDED) || (TA
0f30: 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44 44 45 44  RGET_OS_EMBEDDED
0f40: 3d 3d 30 29 29 20 5c 0a 20 20 20 20 20 20 20 26  ==0)) \.       &
0f50: 26 20 28 21 64 65 66 69 6e 65 64 28 54 41 52 47  & (!defined(TARG
0f60: 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c 41  ET_IPHONE_SIMULA
0f70: 54 4f 52 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  TOR) || (TARGET_
0f80: 49 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52  IPHONE_SIMULATOR
0f90: 3d 3d 30 29 29 0a 23 20 20 20 20 64 65 66 69 6e  ==0)).#    defin
0fa0: 65 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55  e HAVE_GETHOSTUU
0fb0: 49 44 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  ID 1.#  else.#  
0fc0: 20 20 77 61 72 6e 69 6e 67 20 22 67 65 74 68 6f    warning "getho
0fd0: 73 74 75 75 69 64 28 29 20 69 73 20 64 69 73 61  stuuid() is disa
0fe0: 62 6c 65 64 2e 22 0a 23 20 20 65 6e 64 69 66 0a  bled.".#  endif.
0ff0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 4f 53 5f  #endif...#if OS_
1000: 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c 75 64  VXWORKS.# includ
1010: 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a  e <sys/ioctl.h>.
1020: 23 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70  # include <semap
1030: 68 6f 72 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  hore.h>.# includ
1040: 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e  e <limits.h>.#en
1050: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1060: 53 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  S */..#if define
1070: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
1080: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1090: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
10a0: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
10b0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  .h>.#endif..#ifd
10c0: 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 23 20  ef HAVE_UTIME.# 
10d0: 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d 65 2e 68  include <utime.h
10e0: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  >.#endif../*.** 
10f0: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  Allowed values o
1100: 66 20 75 6e 69 78 46 69 6c 65 2e 66 73 46 6c 61  f unixFile.fsFla
1110: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  gs.*/.#define SQ
1120: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
1130: 4d 53 44 4f 53 20 20 20 20 20 30 78 31 0a 0a 2f  MSDOS     0x1../
1140: 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74  *.** If we are t
1150: 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65  o be thread-safe
1160: 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74  , include the pt
1170: 68 72 65 61 64 73 20 68 65 61 64 65 72 2e 0a 2a  hreads header..*
1180: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1190: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
11a0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
11b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  ndif../*.** Defa
11c0: 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ult permissions 
11d0: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
11e0: 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e  new file.*/.#ifn
11f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1200: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1210: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1220: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1230: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34  _PERMISSIONS 064
1240: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
1250: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1260: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1270: 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72  g auto proxy dir
1280: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1290: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
12a0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
12b0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
12c0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
12d0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35  _PERMISSIONS 075
12e0: 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  5.#endif../*.** 
12f0: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1300: 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a  d path-length..*
1310: 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  /.#define MAX_PA
1320: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a  THNAME 512../*.*
1330: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
1340: 74 65 64 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e  ted symbolic lin
1350: 6b 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  ks.*/.#define SQ
1360: 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b  LITE_MAX_SYMLINK
1370: 53 20 31 30 30 0a 0a 2f 2a 20 41 6c 77 61 79 73  S 100../* Always
1380: 20 63 61 73 74 20 74 68 65 20 67 65 74 70 69 64   cast the getpid
1390: 28 29 20 72 65 74 75 72 6e 20 74 79 70 65 20 66  () return type f
13a0: 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  or compatibility
13b0: 20 77 69 74 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20   with.** kernel 
13c0: 6d 6f 64 75 6c 65 73 20 69 6e 20 56 78 57 6f 72  modules in VxWor
13d0: 6b 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6f  ks. */.#define o
13e0: 73 47 65 74 70 69 64 28 58 29 20 28 70 69 64 5f  sGetpid(X) (pid_
13f0: 74 29 67 65 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a  t)getpid()../*.*
1400: 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c  * Only set the l
1410: 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20  astErrno if the 
1420: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20  error code is a 
1430: 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e  real error and n
1440: 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20  ot .** a normal 
1450: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20  expected return 
1460: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42  code of SQLITE_B
1470: 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  USY or SQLITE_OK
1480: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c  .*/.#define IS_L
1490: 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28  OCK_ERROR(x)  ((
14a0: 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  x != SQLITE_OK) 
14b0: 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f  && (x != SQLITE_
14c0: 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61  BUSY))../* Forwa
14d0: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
14e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
14f0: 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b  unixShm unixShm;
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1510: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61  * Connection sha
1520: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red memory */.ty
1530: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1540: 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d  xShmNode unixShm
1550: 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  Node;       /* S
1560: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73  hared memory ins
1570: 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66  tance */.typedef
1580: 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64   struct unixInod
1590: 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49  eInfo unixInodeI
15a0: 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e  nfo;   /* An i-n
15b0: 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ode */.typedef s
15c0: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
15d0: 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b  Fd UnixUnusedFd;
15e0: 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65       /* An unuse
15f0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1600: 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  r */../*.** Some
1610: 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66  times, after a f
1620: 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c  ile handle is cl
1630: 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20  osed by SQLite, 
1640: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1650: 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tor.** cannot be
1660: 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74   closed immediat
1670: 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61  ely. In these ca
1680: 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f  ses, instances o
1690: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
16a0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65  ** structure are
16b0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
16c0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16d0: 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67  or while waiting
16e0: 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72   for an.** oppor
16f0: 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72  tunity to either
1700: 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20   close or reuse 
1710: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e  it..*/.struct Un
1720: 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69  ixUnusedFd {.  i
1730: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1750: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63   descriptor to c
1760: 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  lose */.  int fl
1770: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1780: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69      /* Flags thi
1790: 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
17a0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74  r was opened wit
17b0: 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  h */.  UnixUnuse
17c0: 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  dFd *pNext;     
17d0: 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20   /* Next unused 
17e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17f0: 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a  on same file */.
1800: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e  };../*.** The un
1810: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1820: 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20   is subclass of 
1830: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65  sqlite3_file spe
1840: 63 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69  cific to the uni
1850: 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65  x.** VFS impleme
1860: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70  ntations..*/.typ
1870: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1880: 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73  File unixFile;.s
1890: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b  truct unixFile {
18a0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
18b0: 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65  thods const *pMe
18c0: 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73  thod;  /* Always
18d0: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
18e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
18f0: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
1900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1910: 20 56 46 53 20 74 68 61 74 20 63 72 65 61 74 65   VFS that create
1920: 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20  d this unixFile 
1930: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1940: 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1950: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
1960: 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20   about locks on 
1970: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
1980: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
19b0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
19c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
19d0: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
19e0: 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20      /* The type 
19f0: 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  of lock held on 
1a00: 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73  this fd */.  uns
1a10: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
1a20: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1a30: 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62   /* Behavioral b
1a40: 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a  its.  UNIXFILE_*
1a50: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
1a60: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e  /* The unix errn
1a90: 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20  o from last I/O 
1aa0: 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20  error */.  void 
1ab0: 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  *lockingContext;
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ad0: 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  * Locking style 
1ae0: 73 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a  specific state *
1af0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
1b00: 20 2a 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55   *pPreallocatedU
1b10: 6e 75 73 65 64 3b 20 20 2f 2a 20 50 72 65 2d 61  nused;  /* Pre-a
1b20: 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75  llocated UnixUnu
1b30: 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  sedFd */.  const
1b40: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20   char *zPath;   
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1b70: 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
1b80: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ba0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
1bb0: 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ment information
1bc0: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e   */.  int szChun
1bd0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1bf0: 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c  figured by FCNTL
1c00: 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23  _CHUNK_SIZE */.#
1c10: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1c20: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1c30: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1c60: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
1c70: 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  refs */.  sqlite
1c80: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ca0: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
1cb0: 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52  mapping at pMapR
1cc0: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  egion */.  sqlit
1cd0: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a  e3_int64 mmapSiz
1ce0: 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f  eActual;       /
1cf0: 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  * Actual size of
1d00: 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70   mapping at pMap
1d10: 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  Region */.  sqli
1d20: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
1d30: 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20  zeMax;          
1d40: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
1d50: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
1d60: 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  lue */.  void *p
1d70: 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  MapRegion;      
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65  Memory mapped re
1da0: 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  gion */.#endif. 
1db0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73       /* Device s
1de0: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
1df0: 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63  int deviceCharac
1e00: 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20  teristics;      
1e10: 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74      /* Precomput
1e20: 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ed device charac
1e30: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 69 66  teristics */.#if
1e40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1e50: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
1e60: 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20  nt openFlags;   
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20     /* The flags 
1e90: 73 70 65 63 69 66 69 65 64 20 61 74 20 6f 70 65  specified at ope
1ea0: 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  n() */.#endif.#i
1eb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ec0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c  LOCKING_STYLE ||
1ed0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1ee0: 5f 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66  __).  unsigned f
1ef0: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63            /* cac
1f10: 68 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d  hed details from
1f20: 20 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e   statfs() */.#en
1f30: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1f40: 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54  E_ENABLE_SETLK_T
1f50: 49 4d 45 4f 55 54 0a 20 20 75 6e 73 69 67 6e 65  IMEOUT.  unsigne
1f60: 64 20 69 42 75 73 79 54 69 6d 65 6f 75 74 3b 20  d iBusyTimeout; 
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f80: 57 61 69 74 20 74 68 69 73 20 6d 61 6e 79 20 6d  Wait this many m
1f90: 69 6c 6c 69 73 65 63 20 6f 6e 20 6c 6f 63 6b 73  illisec on locks
1fa0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1fb0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1fc0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
1fd0: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
1fe0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
1ff0: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
2000: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2010: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
2020: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
2030: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
2040: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
2050: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2060: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
2070: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
2080: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
2090: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
20a0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
20b0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
20c0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
20d0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
20e0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
20f0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2100: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2110: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2120: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2130: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2140: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2150: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2160: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2170: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2180: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2190: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
21a0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
21b0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
21c0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
21d0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
21e0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
21f0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2200: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2210: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2220: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2230: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2240: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2250: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2260: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2270: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2280: 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23  on */..#endif..#
2290: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22a0: 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d  T.  /* In test m
22b0: 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ode, increase th
22c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73  e size of this s
22d0: 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73  tructure a bit s
22e0: 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20  o that .  ** it 
22f0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
2300: 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46  he struct CrashF
2310: 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ile defined in t
2320: 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63  est6.c..  */.  c
2330: 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d  har aPadding[32]
2340: 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20  ;.#endif.};../* 
2350: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f  This variable ho
2360: 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20  lds the process 
2370: 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68  id (pid) from wh
2380: 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  en the xRandomne
2390: 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77  ss().** method w
23a0: 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78  as called.  If x
23b0: 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  Open() is called
23c0: 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e   from a differen
23d0: 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a  t process id,.**
23e0: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
23f0: 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63   a fork() has oc
2400: 63 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47  curred, the PRNG
2410: 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a   will be reset..
2420: 2a 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20  */.static pid_t 
2430: 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
2440: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  0;../*.** Allowe
2450: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
2460: 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c   unixFile.ctrlFl
2470: 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a  ags bitmask:.*/.
2480: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2490: 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30  _EXCL        0x0
24a0: 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  1     /* Connect
24b0: 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72  ions from one pr
24c0: 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64  ocess only */.#d
24d0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52  efine UNIXFILE_R
24e0: 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20  DONLY      0x02 
24f0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
2500: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
2510: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2520: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30  LE_PERSIST_WAL 0
2530: 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69  x04     /* Persi
2540: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
2550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2560: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
2570: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
2580: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2590: 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74  08     /* Direct
25a0: 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20  ory sync needed 
25b0: 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  */.#else.# defin
25c0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
25d0: 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69  NC    0x00.#endi
25e0: 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  f.#define UNIXFI
25f0: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30  LE_PSOW        0
2600: 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  x10     /* SQLIT
2610: 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
2620: 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23  E_OVERWRITE */.#
2630: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2640: 44 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30  DELETE      0x20
2650: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
2660: 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69  n close */.#defi
2670: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20  ne UNIXFILE_URI 
2680: 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20          0x40    
2690: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67   /* Filename mig
26a0: 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61  ht have query pa
26b0: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66  rameters */.#def
26c0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  ine UNIXFILE_NOL
26d0: 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20  OCK      0x80   
26e0: 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20    /* Do no file 
26f0: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  locking */../*.*
2700: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
2710: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
2720: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
2730: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
2740: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
2750: 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75  ** Define variou
2760: 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72  s macros that ar
2770: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73  e missing from s
2780: 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ome systems..*/.
2790: 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  #ifndef O_LARGEF
27a0: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
27b0: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
27c0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
27d0: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e  DISABLE_LFS.# un
27e0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
27f0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2800: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2810: 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  fndef O_NOFOLLOW
2820: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f  .# define O_NOFO
2830: 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69  LLOW 0.#endif.#i
2840: 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23  fndef O_BINARY.#
2850: 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59   define O_BINARY
2860: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2870: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
2880: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
2890: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
28a0: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
28b0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
28c0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
28d0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
28e0: 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65  READSAFE.#define
28f0: 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61   threadid pthrea
2900: 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23  d_self().#else.#
2910: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
2920: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2930: 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61  HAVE_MREMAP defa
2940: 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20  ults to true on 
2950: 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20  Linux and false 
2960: 65 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e  everywhere else.
2970: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
2980: 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20  (HAVE_MREMAP).# 
2990: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  if defined(__lin
29a0: 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ux__) && defined
29b0: 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20  (_GNU_SOURCE).# 
29c0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45   define HAVE_MRE
29d0: 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20  MAP 1.# else.#  
29e0: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
29f0: 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e  AP 0.# endif.#en
2a00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69  dif../*.** Expli
2a10: 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36  citly call the 6
2a20: 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66  4-bit version of
2a30: 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72   lseek() on Andr
2a40: 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  oid. Otherwise, 
2a50: 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68  lseek().** is th
2a60: 65 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e  e 32-bit version
2a70: 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f  , even if _FILE_
2a80: 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69  OFFSET_BITS=64 i
2a90: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
2aa0: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
2ab0: 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20  .# define lseek 
2ac0: 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a  lseek64.#endif..
2ad0: 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
2ae0: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65  ./*.** Linux-spe
2af0: 63 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69  cific IOCTL magi
2b00: 63 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66  c numbers used f
2b10: 6f 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46  or controlling F
2b20: 32 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  2FS.*/.#define F
2b30: 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20  2FS_IOCTL_MAGIC 
2b40: 20 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66         0xf5.#def
2b50: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41  ine F2FS_IOC_STA
2b60: 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  RT_ATOMIC_WRITE 
2b70: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b80: 54 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65  TL_MAGIC, 1).#de
2b90: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f  fine F2FS_IOC_CO
2ba0: 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54  MMIT_ATOMIC_WRIT
2bb0: 45 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  E    _IO(F2FS_IO
2bc0: 43 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64  CTL_MAGIC, 2).#d
2bd0: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53  efine F2FS_IOC_S
2be0: 54 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  TART_VOLATILE_WR
2bf0: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2c00: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23  OCTL_MAGIC, 3).#
2c10: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2c20: 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57  ABORT_VOLATILE_W
2c30: 52 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f  RITE   _IO(F2FS_
2c40: 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a  IOCTL_MAGIC, 5).
2c50: 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43  #define F2FS_IOC
2c60: 5f 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20  _GET_FEATURES   
2c70: 20 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46          _IOR(F2F
2c80: 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31  S_IOCTL_MAGIC, 1
2c90: 32 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20  2, u32).#define 
2ca0: 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f  F2FS_FEATURE_ATO
2cb0: 4d 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34  MIC_WRITE 0x0004
2cc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
2cd0: 75 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  ux__ */.../*.** 
2ce0: 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73  Different Unix s
2cf0: 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f  ystems declare o
2d00: 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65  pen() in differe
2d10: 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75  nt ways.  Same u
2d20: 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74  se.** open(const
2d30: 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f   char*,int,mode_
2d40: 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20  t).  Others use 
2d50: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
2d60: 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68  ,int,...)..** Th
2d70: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
2d80: 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75  important when u
2d90: 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  sing a pointer t
2da0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  o the function..
2db0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74  **.** The safest
2dc0: 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74   way to deal wit
2dd0: 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  h the problem is
2de0: 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74   to always use t
2df0: 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77  his wrapper.** w
2e00: 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20  hich always has 
2e10: 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65  the same well-de
2e20: 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e  fined interface.
2e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2e40: 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63  osixOpen(const c
2e50: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
2e60: 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29  flags, int mode)
2e70: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28  {.  return open(
2e80: 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f  zFile, flags, mo
2e90: 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  de);.}../* Forwa
2ea0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2eb0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2ec0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2ed0: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61  har*, int*);.sta
2ee0: 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70  tic int unixGetp
2ef0: 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a  agesize(void);..
2f00: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
2f10: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
2f20: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
2f30: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
2f40: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
2f50: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
2f60: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
2f70: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
2f80: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
2f90: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
2fa0: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
2fb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
2fc0: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
2fd0: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
2fe0: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
2ff0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3000: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
3010: 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63  struct unix_sysc
3020: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
3030: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
3040: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3050: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
3060: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
3070: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
3080: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
3090: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
30a0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
30b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
30c0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
30d0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
30e0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
30f0: 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20    { "open",     
3100: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3110: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70  call_ptr)posixOp
3120: 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  en,  0  },.#defi
3130: 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28  ne osOpen      (
3140: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3150: 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79  ar*,int,int))aSy
3160: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
3170: 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c  t)..  { "close",
3180: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3190: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f  _syscall_ptr)clo
31a0: 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  se,      0  },.#
31b0: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20  define osClose  
31c0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29     ((int(*)(int)
31d0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
31e0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63  rrent)..  { "acc
31f0: 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ess",       (sql
3200: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3210: 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20  )access,     0  
3220: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63  },.#define osAcc
3230: 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ess    ((int(*)(
3240: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
3250: 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75  )aSyscall[2].pCu
3260: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
3270: 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  cwd",       (sql
3280: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3290: 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20  )getcwd,     0  
32a0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
32b0: 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a  cwd    ((char*(*
32c0: 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29  )(char*,size_t))
32d0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
32e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74  rent)..  { "stat
32f0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
3300: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3310: 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d  stat,       0  }
3320: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74  ,.#define osStat
3330: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
3340: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
3350: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
3360: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
3370: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
3380: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
3390: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
33a0: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
33b0: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
33c0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
33d0: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
33e0: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
33f0: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
3400: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
3410: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
3420: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
3430: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
3440: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
3450: 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61   it is DOS - wha
3460: 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74  t did you expect
3470: 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a  ?.*/.#ifdef __DJ
3480: 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74  GPP__.  { "fstat
3490: 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20  ",        0,    
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
34b0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
34c0: 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23  at(a,b,c)    0.#
34d0: 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66  else     .  { "f
34e0: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73  stat",        (s
34f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3500: 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30  tr)fstat,      0
3510: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
3520: 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a  stat     ((int(*
3530: 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61  )(int,struct sta
3540: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e  t*))aSyscall[5].
3550: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
3560: 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65  ..  { "ftruncate
3570: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3580: 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e  yscall_ptr)ftrun
3590: 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65  cate,  0  },.#de
35a0: 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65  fine osFtruncate
35b0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
35c0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  f_t))aSyscall[6]
35d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
35e0: 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20  "fcntl",        
35f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3600: 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20  _ptr)fcntl,     
3610: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3620: 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74  sFcntl     ((int
3630: 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29  (*)(int,int,...)
3640: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
3650: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
3660: 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  d",         (sql
3670: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3680: 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20  )read,       0  
3690: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
36a0: 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  d      ((ssize_t
36b0: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
36c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38  ze_t))aSyscall[8
36d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
36e0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
36f0: 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  AD) || SQLITE_EN
3700: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
3710: 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  LE.  { "pread", 
3720: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3730: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61  syscall_ptr)prea
3740: 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  d,      0  },.#e
3750: 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  lse.  { "pread",
3760: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3770: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3780: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3790: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
37a0: 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a  Pread     ((ssiz
37b0: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
37c0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61  ,size_t,off_t))a
37d0: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
37e0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
37f0: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
3800: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
3810: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3820: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c  all_ptr)pread64,
3830: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
3840: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
3850: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3860: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3870: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3880: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
3890: 64 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  d64 ((ssize_t(*)
38a0: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
38b0: 74 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63  t,off64_t))aSysc
38c0: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
38d0: 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20  )..  { "write", 
38e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
38f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74  syscall_ptr)writ
3900: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3910: 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20  efine osWrite   
3920: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3930: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3940: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3950: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
3960: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3970: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3980: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3990: 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65  TYLE.  { "pwrite
39a0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
39b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
39c0: 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a  rite,     0  },.
39d0: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
39e0: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
39f0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3a00: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3a10: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3a20: 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73  osPwrite    ((ss
3a30: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
3a40: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
3a50: 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20  off_t))\.       
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79               aSy
3a70: 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65  scall[12].pCurre
3a80: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3a90: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3aa0: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3ab0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3ac0: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c  ll_ptr)pwrite64,
3ad0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3ae0: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
3af0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b00: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3b10: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3b20: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
3b30: 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e64  ((ssize_t(*
3b40: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
3b50: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74  *,size_t,off64_t
3b60: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3b70: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3b80: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
3b90: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
3ba0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3bb0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
3bc0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3bd0: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3be0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3bf0: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3c00: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
3c10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3c20: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3c30: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
3c40: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
3c50: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3c60: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c70: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
3c80: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
3c90: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3ca0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3cb0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3cd0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3ce0: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3cf0: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3d00: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3d10: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3d20: 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20  { "unlink",     
3d30: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3d40: 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20  ll_ptr)unlink,  
3d50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3d60: 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20  efine osUnlink  
3d70: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3d80: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3d90: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
3da0: 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f    { "openDirecto
3db0: 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  ry",    (sqlite3
3dc0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65  _syscall_ptr)ope
3dd0: 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20  nDirectory,     
3de0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3df0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28  OpenDirectory ((
3e00: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3e10: 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c  r*,int*))aSyscal
3e20: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3e30: 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20  .  { "mkdir",   
3e40: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e50: 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c  scall_ptr)mkdir,
3e60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e70: 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20  #define osMkdir 
3e80: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3e90: 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29  st char*,mode_t)
3ea0: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3eb0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d  urrent)..  { "rm
3ec0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
3ed0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3ee0: 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  r)rmdir,        
3ef0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3f00: 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e  osRmdir     ((in
3f10: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3f20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
3f30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3f40: 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57  fined(HAVE_FCHOW
3f50: 4e 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c  N).  { "fchown",
3f60: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3f70: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f  syscall_ptr)fcho
3f80: 77 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  wn,          0 }
3f90: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68  ,.#else.  { "fch
3fa0: 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c  own",       (sql
3fb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3fc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3fd0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3fe0: 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20  efine osFchown  
3ff0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75    ((int(*)(int,u
4000: 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73  id_t,gid_t))aSys
4010: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
4020: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4030: 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 7b  HAVE_FCHOWN).  {
4040: 20 22 67 65 74 65 75 69 64 22 2c 20 20 20 20 20   "geteuid",     
4050: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4060: 6c 5f 70 74 72 29 67 65 74 65 75 69 64 2c 20 20  l_ptr)geteuid,  
4070: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4080: 65 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22 2c  e.  { "geteuid",
4090: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
40a0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
40c0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
40d0: 6f 73 47 65 74 65 75 69 64 20 20 20 28 28 75 69  osGeteuid   ((ui
40e0: 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79  d_t(*)(void))aSy
40f0: 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65  scall[21].pCurre
4100: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
4110: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
4120: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
4130: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
4140: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20   "mmap",        
4150: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4160: 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20  l_ptr)mmap,     
4170: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4180: 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20  e.  { "mmap",   
4190: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
41a0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
41c0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
41d0: 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a  osMmap ((void*(*
41e0: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69  )(void*,size_t,i
41f0: 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74  nt,int,int,off_t
4200: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
4210: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
4220: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4230: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
4240: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
4250: 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  0.  { "munmap", 
4260: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
4270: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61  yscall_ptr)munma
4280: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
4290: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75 6e 6d  .#else.  { "munm
42a0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
42b0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
42c0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
42d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
42e0: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
42f0: 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a  int(*)(void*,siz
4300: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  e_t))aSyscall[23
4310: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4320: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 26 26 20   HAVE_MREMAP && 
4330: 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  (!defined(SQLITE
4340: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
4350: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
4360: 5a 45 3e 30 29 0a 20 20 7b 20 22 6d 72 65 6d 61  ZE>0).  { "mrema
4370: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
4380: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
4390: 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  remap,          
43a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
43b0: 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28  mremap",       (
43c0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
43d0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
43e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
43f0: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61  .#define osMrema
4400: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
4410: 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74  d*,size_t,size_t
4420: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
4430: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
4440: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
4460: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
4470: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 67  AP_SIZE>0.  { "g
4480: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
4490: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
44a0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
44b0: 7a 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  ze, 0 },.#else. 
44c0: 20 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65 22   { "getpagesize"
44d0: 2c 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63  ,  (sqlite3_sysc
44e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
44f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4500: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 47  ndif.#define osG
4510: 65 74 70 61 67 65 73 69 7a 65 20 28 28 69 6e 74  etpagesize ((int
4520: 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73 63 61  (*)(void))aSysca
4530: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
4540: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
4550: 56 45 5f 52 45 41 44 4c 49 4e 4b 29 0a 20 20 7b  VE_READLINK).  {
4560: 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20   "readlink",    
4570: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4580: 6c 5f 70 74 72 29 72 65 61 64 6c 69 6e 6b 2c 20  l_ptr)readlink, 
4590: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
45a0: 65 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22  e.  { "readlink"
45b0: 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ,     (sqlite3_s
45c0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
45e0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
45f0: 6f 73 52 65 61 64 6c 69 6e 6b 20 28 28 73 73 69  osReadlink ((ssi
4600: 7a 65 5f 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  ze_t(*)(const ch
4610: 61 72 2a 2c 63 68 61 72 2a 2c 73 69 7a 65 5f 74  ar*,char*,size_t
4620: 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70  ))aSyscall[26].p
4630: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4640: 66 69 6e 65 64 28 48 41 56 45 5f 4c 53 54 41 54  fined(HAVE_LSTAT
4650: 29 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20  ).  { "lstat",  
4660: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4670: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6c 73 74 61  syscall_ptr)lsta
4680: 74 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  t,          0 },
4690: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6c 73 74 61  .#else.  { "lsta
46a0: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
46b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
46c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
46d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
46e0: 66 69 6e 65 20 6f 73 4c 73 74 61 74 20 20 20 20  fine osLstat    
46f0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
4700: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
4710: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  at*))aSyscall[27
4720: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4730: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
4740: 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  __) && defined(S
4750: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
4760: 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29  CH_ATOMIC_WRITE)
4770: 0a 23 20 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f  .# ifdef __ANDRO
4780: 49 44 5f 5f 0a 20 20 7b 20 22 69 6f 63 74 6c 22  ID__.  { "ioctl"
4790: 2c 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61  , (sqlite3_sysca
47a0: 6c 6c 5f 70 74 72 29 28 69 6e 74 28 2a 29 28 69  ll_ptr)(int(*)(i
47b0: 6e 74 2c 20 69 6e 74 2c 20 2e 2e 2e 29 29 69 6f  nt, int, ...))io
47c0: 63 74 6c 2c 20 30 20 7d 2c 0a 23 20 65 6c 73 65  ctl, 0 },.# else
47d0: 0a 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20  .  { "ioctl",   
47e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
47f0: 79 73 63 61 6c 6c 5f 70 74 72 29 69 6f 63 74 6c  yscall_ptr)ioctl
4800: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
4810: 23 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20  # endif.#else.  
4820: 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20  { "ioctl",      
4830: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
4840: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
4850: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4860: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 49 6f  dif.#define osIo
4870: 63 74 6c 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ctl ((int(*)(int
4880: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
4890: 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[28].pCurrent)
48a0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
48b0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
48c0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
48d0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ../*.** On some 
48e0: 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74  systems, calls t
48f0: 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20  o fchown() will 
4900: 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67  trigger a messag
4910: 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a  e in a security.
4920: 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63  ** log if they c
4930: 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f  ome from non-roo
4940: 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f  t processes.  So
4950: 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66   avoid calling f
4960: 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65  chown() if.** we
4970: 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67   are not running
4980: 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61   as root..*/.sta
4990: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63  tic int robustFc
49a0: 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64  hown(int fd, uid
49b0: 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69  _t uid, gid_t gi
49c0: 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
49d0: 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72  HAVE_FCHOWN).  r
49e0: 65 74 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28  eturn osGeteuid(
49f0: 29 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e  ) ? 0 : osFchown
4a00: 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65  (fd,uid,gid);.#e
4a10: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  lse.  return 0;.
4a20: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
4a30: 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74  This is the xSet
4a40: 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74  SystemCall() met
4a50: 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  hod of sqlite3_v
4a60: 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  fs for all of th
4a70: 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65  e.** "unix" VFSe
4a80: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
4a90: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
4aa0: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
4ab0: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
4ac0: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
4ad0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
4ae0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
4af0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
4b00: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
4b10: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
4b20: 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74   int unixSetSyst
4b30: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
4b40: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
4b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
4b60: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
4b70: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
4b80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
4b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4ba0: 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   of system call 
4bb0: 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20  to override */. 
4bc0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
4bd0: 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f  _ptr pNewFunc  /
4be0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
4bf0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c   system call val
4c00: 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
4c10: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ned int i;.  int
4c20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
4c30: 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44  FOUND;..  UNUSED
4c40: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
4c50: 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  sed);.  if( zNam
4c60: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e==0 ){.    /* I
4c70: 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69  f no zName is gi
4c80: 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c  ven, restore all
4c90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f   system calls to
4ca0: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20   their default. 
4cb0: 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61     ** settings a
4cc0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20  nd return NULL. 
4cd0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
4ce0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f  QLITE_OK;.    fo
4cf0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
4d00: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
4d10: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
4d20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
4d30: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4d40: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ult ){.        a
4d50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4d60: 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ent = aSyscall[i
4d70: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
4d80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
4d90: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  e{.    /* If zNa
4da0: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
4db0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79   operate on only
4dc0: 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20   the one system 
4dd0: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63  call.    ** spec
4de0: 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
4df0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4e00: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4e10: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4e20: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
4e30: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4e40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
4e50: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
4e60: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
4e70: 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b  ].pDefault==0 ){
4e80: 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63  .          aSysc
4e90: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
4ea0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  = aSyscall[i].pC
4eb0: 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
4ec0: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  }.        rc = S
4ed0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
4ee0: 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d    if( pNewFunc==
4ef0: 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61  0 ) pNewFunc = a
4f00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4f10: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79  ult;.        aSy
4f20: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4f30: 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20  t = pNewFunc;.  
4f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4f60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4f70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4f80: 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65  value of a syste
4f90: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
4fa0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73  NULL if zName is
4fb0: 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e   not a.** recogn
4fc0: 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c  ized system call
4fd0: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20   name.  NULL is 
4fe0: 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
4ff0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
5000: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
5010: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
5020: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79  tatic sqlite3_sy
5030: 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65  scall_ptr unixGe
5040: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
5050: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
5060: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
5070: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
5080: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
5090: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
50a0: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
50b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
50c0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
50d0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
50e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
50f0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
5100: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
5110: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
5120: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5150: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
5160: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
5170: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
5180: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
5190: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
51a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
51b0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
51c0: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
51d0: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
51e0: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
51f0: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
5200: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
5210: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
5220: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
5230: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5240: 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43  *unixNextSystemC
5250: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
5260: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5270: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
5280: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
5290: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
52a0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
52b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
52c0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
52d0: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
52e0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
52f0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
5300: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
5310: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
5320: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
5330: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
5340: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
5350: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
5360: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
5370: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
5380: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
5390: 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63  ./*.** Do not ac
53a0: 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65  cept any file de
53b0: 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68  scriptor less th
53c0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69  an this value, i
53d0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
53e0: 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61  .** opening data
53f0: 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20  base file using 
5400: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
5410: 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
5420: 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20  ly used for .** 
5430: 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20  standard input, 
5440: 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f  output, and erro
5450: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  r..*/.#ifndef SQ
5460: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
5470: 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64  E_DESCRIPTOR.# d
5480: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e  efine SQLITE_MIN
5490: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
54a0: 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f  PTOR 3.#endif../
54b0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e  *.** Invoke open
54c0: 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69  ().  Do so multi
54d0: 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c  ple times, until
54e0: 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65   it either succe
54f0: 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20  eds or.** fails 
5500: 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20  for some reason 
5510: 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52  other than EINTR
5520: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
5530: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
5540: 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20  e "m" is 0 then 
5550: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65  set it to the de
5560: 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c  fault for.** SQL
5570: 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ite.  The defaul
5580: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41  t is SQLITE_DEFA
5590: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
55a0: 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a  IONS (normally.*
55b0: 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66  * 0644) as modif
55c0: 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65  ied by the syste
55d0: 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69  m umask.  If m i
55e0: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a  s not 0, then.**
55f0: 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63   make the file c
5600: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20  reation mode be 
5610: 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69  exactly m ignori
5620: 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  ng the umask..**
5630: 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65  .** The m parame
5640: 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d  ter will be non-
5650: 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63  zero only when c
5660: 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a  reating -wal, -j
5670: 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d  ournal,.** and -
5680: 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77  shm files.  We w
5690: 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20  ant those files 
56a0: 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79  to have *exactly
56b0: 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65  * the same.** pe
56c0: 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65  rmissions as the
56d0: 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
56e0: 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61  base, unadultera
56f0: 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
5700: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79  ..** In that way
5710: 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  , if a database 
5720: 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72  file is -rw-rw-r
5730: 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20  w or -rw-rw-r-, 
5740: 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63  and a.** transac
5750: 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64  tion crashes and
5760: 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68   leaves behind h
5770: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  ot journals, the
5780: 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73  n any.** process
5790: 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f   that is able to
57a0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
57b0: 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f  tabase will also
57c0: 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72   be able to.** r
57d0: 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a  ecover the hot j
57e0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ournals..*/.stat
57f0: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70  ic int robust_op
5800: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
5810: 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20  , int f, mode_t 
5820: 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  m){.  int fd;.  
5830: 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20  mode_t m2 = m ? 
5840: 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  m : SQLITE_DEFAU
5850: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
5860: 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  ONS;.  while(1){
5870: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43  .#if defined(O_C
5880: 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d  LOEXEC).    fd =
5890: 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c   osOpen(z,f|O_CL
58a0: 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65  OEXEC,m2);.#else
58b0: 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e  .    fd = osOpen
58c0: 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66  (z,f,m2);.#endif
58d0: 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
58e0: 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
58f0: 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e  ==EINTR ) contin
5900: 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ue;.      break;
5910: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
5920: 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  d>=SQLITE_MINIMU
5930: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
5940: 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f  R ) break;.    o
5950: 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20  sClose(fd);.    
5960: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
5970: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20  TE_WARNING, .   
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74               "at
5990: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22  tempt to open \"
59a0: 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73  %s\" as file des
59b0: 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20  criptor %d", z, 
59c0: 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31  fd);.    fd = -1
59d0: 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e  ;.    if( osOpen
59e0: 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c  ("/dev/null", f,
59f0: 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   m)<0 ) break;. 
5a00: 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29   }.  if( fd>=0 )
5a10: 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29  {.    if( m!=0 )
5a20: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
5a30: 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20  tat statbuf;.   
5a40: 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66     if( osFstat(f
5a50: 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20  d, &statbuf)==0 
5a60: 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62  .       && statb
5a70: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20  uf.st_size==0.  
5a80: 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66       && (statbuf
5a90: 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d  .st_mode&0777)!=
5aa0: 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  m .      ){.    
5ab0: 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c      osFchmod(fd,
5ac0: 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   m);.      }.   
5ad0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46   }.#if defined(F
5ae0: 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21  D_CLOEXEC) && (!
5af0: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
5b00: 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d  C) || O_CLOEXEC=
5b10: 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  =0).    osFcntl(
5b20: 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
5b30: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
5b40: 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
5b50: 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  C);.#endif.  }. 
5b60: 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f   return fd;.}../
5b70: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
5b80: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
5b90: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
5ba0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
5bb0: 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
5bc0: 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
5bd0: 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78  protect the unix
5be0: 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a  InodeInfo and.**
5bf0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
5c00: 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74  bjects used by t
5c10: 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
5c20: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
5c30: 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  * shared by mult
5c40: 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
5c50: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69  .** Function uni
5c60: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
5c70: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
5c80: 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
5c90: 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
5ca0: 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
5cb0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
5cc0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
5cd0: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
5ce0: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
5cf0: 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e   e.g..**.**   un
5d00: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  ixEnterMutex().*
5d10: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  *     assert( un
5d20: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
5d30: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c  .**   unixEnterL
5d40: 65 61 76 65 28 29 0a 2a 2a 0a 2a 2a 20 54 6f 20  eave().**.** To 
5d50: 70 72 65 76 65 6e 74 20 64 65 61 64 6c 6f 63 6b  prevent deadlock
5d60: 2c 20 74 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69  , the global uni
5d70: 78 42 69 67 4c 6f 63 6b 20 6d 75 73 74 20 6d 75  xBigLock must mu
5d80: 73 74 20 62 65 20 61 63 71 75 69 72 65 64 0a 2a  st be acquired.*
5d90: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 75 6e 69  * before the uni
5da0: 78 49 6e 6f 64 65 49 6e 66 6f 2e 70 4c 6f 63 6b  xInodeInfo.pLock
5db0: 4d 75 74 65 78 20 6d 75 74 65 78 2c 20 69 66 20  Mutex mutex, if 
5dc0: 62 6f 74 68 20 61 72 65 20 68 65 6c 64 2e 20 20  both are held.  
5dd0: 49 74 20 69 73 0a 2a 2a 20 4f 4b 20 74 6f 20 67  It is.** OK to g
5de0: 65 74 20 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65  et the pLockMute
5df0: 78 20 77 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e  x without holdin
5e00: 67 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20 66 69  g unixBigLock fi
5e10: 72 73 74 2c 20 62 75 74 20 69 66 0a 2a 2a 20 74  rst, but if.** t
5e20: 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65  hat happens, the
5e30: 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74   unixBigLock mut
5e40: 65 78 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61  ex must not be a
5e50: 63 71 75 69 72 65 64 20 75 6e 74 69 6c 20 61 66  cquired until af
5e60: 74 65 72 0a 2a 2a 20 70 4c 6f 63 6b 4d 75 74 65  ter.** pLockMute
5e70: 78 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  x is released..*
5e80: 2a 0a 2a 2a 20 20 20 20 20 20 4f 4b 3a 20 20 20  *.**      OK:   
5e90: 20 20 65 6e 74 65 72 28 75 6e 69 78 42 69 67 4c    enter(unixBigL
5ea0: 6f 63 6b 29 2c 20 20 65 6e 74 65 72 28 70 4c 6f  ock),  enter(pLo
5eb0: 63 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 20 20 20  ckInfo).**      
5ec0: 4f 4b 3a 20 20 20 20 20 65 6e 74 65 72 28 75 6e  OK:     enter(un
5ed0: 69 78 42 69 67 4c 6f 63 6b 29 0a 2a 2a 20 20 20  ixBigLock).**   
5ee0: 20 20 20 4f 4b 3a 20 20 20 20 20 65 6e 74 65 72     OK:     enter
5ef0: 28 70 4c 6f 63 6b 49 6e 66 6f 29 0a 2a 2a 20 20  (pLockInfo).**  
5f00: 20 45 52 52 4f 52 3a 20 20 20 20 20 65 6e 74 65   ERROR:     ente
5f10: 72 28 70 4c 6f 63 6b 49 6e 66 6f 29 2c 20 65 6e  r(pLockInfo), en
5f20: 74 65 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29  ter(unixBigLock)
5f30: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
5f40: 65 33 5f 6d 75 74 65 78 20 2a 75 6e 69 78 42 69  e3_mutex *unixBi
5f50: 67 4c 6f 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69  gLock = 0;.stati
5f60: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
5f70: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 61  Mutex(void){.  a
5f80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5f90: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 75 6e 69  utex_notheld(uni
5fa0: 78 42 69 67 4c 6f 63 6b 29 20 29 3b 20 20 2f 2a  xBigLock) );  /*
5fb0: 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   Not a recursive
5fc0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 73 71 6c 69   mutex */.  sqli
5fd0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
5fe0: 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a  unixBigLock);.}.
5ff0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
6000: 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
6010: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
6020: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 75  te3_mutex_held(u
6030: 6e 69 78 42 69 67 4c 6f 63 6b 29 20 29 3b 0a 20  nixBigLock) );. 
6040: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6050: 65 61 76 65 28 75 6e 69 78 42 69 67 4c 6f 63 6b  eave(unixBigLock
6060: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
6070: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
6080: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
6090: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
60a0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
60b0: 5f 68 65 6c 64 28 75 6e 69 78 42 69 67 4c 6f 63  _held(unixBigLoc
60c0: 6b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  k);.}.#endif...#
60d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
60e0: 45 5f 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  E_OS_TRACE./*.**
60f0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
6100: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
6110: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
6120: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
6130: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
6140: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
6150: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
6160: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
6170: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
6180: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
6190: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
61a0: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
61b0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
61c0: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
61d0: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
61e0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
61f0: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
6200: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
6210: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
6220: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
6230: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
6240: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
6250: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
6260: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
6270: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
6280: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
6290: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
62a0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
62b0: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
62c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
62d0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
62e0: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
62f0: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
6300: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
6310: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6320: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
6330: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
6340: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
6350: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
6360: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
6370: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
6380: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
6390: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
63a0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
63b0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
63c0: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
63d0: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
63e0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
63f0: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
6400: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
6410: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
6420: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
6430: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
6440: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
6450: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
6460: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
6470: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
6480: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
6490: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
64a0: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
64b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
64c0: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
64d0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
64e0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
64f0: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
6500: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
6510: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
6520: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
6530: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
6540: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
6550: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
6560: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
6570: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
6580: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
6590: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
65a0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
65b0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
65c0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
65d0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
65e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
65f0: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
6600: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
6610: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
6620: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
6630: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
6640: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
6650: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
6660: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
6670: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
6680: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
6690: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
66a0: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
66b0: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
66c0: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
66d0: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
66e0: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
66f0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
6700: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
6710: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
6720: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
6730: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
6740: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
6750: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
6760: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
6770: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
6780: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
6790: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
67a0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
67b0: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
67c0: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
67d0: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
67e0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
67f0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
6800: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
6810: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
6820: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6830: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
6840: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
6850: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
6860: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
6870: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
6880: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
6890: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
68a0: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
68b0: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
68c0: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
68d0: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
68e0: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
68f0: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
6900: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
6910: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
6920: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
6930: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
6940: 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20   to EINTR.**.** 
6950: 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72  All calls to ftr
6960: 75 6e 63 61 74 65 28 29 20 77 69 74 68 69 6e 20  uncate() within 
6970: 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64  this file should
6980: 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68   be made through
6990: 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70 65 72  .** this wrapper
69a0: 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69  .  On the Androi
69b0: 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61  d platform, bypa
69c0: 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20  ssing the logic 
69d0: 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c  below.** could l
69e0: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
69f0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
6a00: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
6a10: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
6a20: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
6a30: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  z){.  int rc;.#i
6a40: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
6a50: 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64  .  /* On Android
6a60: 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c  , ftruncate() al
6a70: 77 61 79 73 20 75 73 65 73 20 33 32 2d 62 69 74  ways uses 32-bit
6a80: 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69   offsets, even i
6a90: 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46  f .  ** _FILE_OF
6aa0: 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20  FSET_BITS=64 is 
6ab0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65  defined. This me
6ac0: 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61 66 65  ans it is unsafe
6ad0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20   to attempt to. 
6ae0: 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66   ** truncate a f
6af0: 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20  ile to any size 
6b00: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47 69 42  larger than 2GiB
6b10: 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  . Silently ignor
6b20: 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  e any.  ** such 
6b30: 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20  attempts.  */.  
6b40: 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f  if( sz>(sqlite3_
6b50: 69 6e 74 36 34 29 30 78 37 46 46 46 46 46 46 46  int64)0x7FFFFFFF
6b60: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6b70: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a  ITE_OK;.  }else.
6b80: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20  #endif.  do{ rc 
6b90: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
6ba0: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
6bb0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
6bc0: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
6bd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6be0: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
6bf0: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
6c00: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
6c10: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
6c20: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
6c30: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
6c40: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
6c50: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
6c60: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
6c70: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
6c80: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
6c90: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
6ca0: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
6cb0: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
6cc0: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
6cd0: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
6ce0: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
6cf0: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
6d00: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
6d10: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
6d20: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
6d30: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
6d40: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
6d50: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
6d60: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
6d70: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
6d80: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
6d90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6da0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
6db0: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
6dc0: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
6dd0: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73  iteIOErr) {.  as
6de0: 73 65 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45  sert( (sqliteIOE
6df0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6e00: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
6e10: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6e20: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6e30: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
6e40: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
6e50: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6e60: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
6e70: 7c 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c  |.          (sql
6e80: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6e90: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
6ea0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20  SERVEDLOCK) );. 
6eb0: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
6ec0: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41  ror) {.  case EA
6ed0: 43 43 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41  CCES: .  case EA
6ee0: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
6ef0: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
6f00: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
6f10: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
6f20: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
6f30: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
6f40: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
6f50: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
6f60: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
6f70: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
6f80: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
6f90: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
6fa0: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
6fb0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
6fc0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 50 45 52      .  case EPER
6fd0: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
6fe0: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
6ff0: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
7000: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
7010: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  Err;.  }.}.../**
7020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
7080: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
7090: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
70a0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
70b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
70c0: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
70d0: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
70e0: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
70f0: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
7100: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
7110: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
7120: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
7130: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
7140: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
7150: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
7160: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
7170: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
7180: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
7190: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
71a0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
71b0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
71c0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
71d0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
71e0: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
71f0: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
7200: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
7210: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
7220: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
7230: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
7240: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
7250: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
7260: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
7270: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7280: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
7290: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
72a0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
72b0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
72c0: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
72d0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
72e0: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
72f0: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
7300: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
7310: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
7320: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
7330: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
7340: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
7350: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
7360: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
7370: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
7380: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
7390: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
73a0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
73b0: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
73c0: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
73d0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
73e0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7400: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
7410: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
7420: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
7450: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
7460: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
7470: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
7480: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
7490: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
74a0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
74b0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
74c0: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
74d0: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
74e0: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
74f0: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
7500: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
7510: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
7520: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
7530: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
7540: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
7550: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
7560: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
7570: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
7580: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
7590: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
75a0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
75b0: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
75c0: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
75d0: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
75e0: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
75f0: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
7600: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
7610: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
7620: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
7630: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
7640: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
7650: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
7660: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
7670: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
7680: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
7690: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
76a0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
76b0: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
76c0: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
76d0: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
76e0: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
76f0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
7700: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
7710: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
7720: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
7730: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
7740: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
7750: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
7760: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
7770: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
7780: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
7790: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
77a0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
77b0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
77c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
77d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
77e0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
77f0: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
7800: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
7810: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
7820: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
7830: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
7840: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
7850: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
7860: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
7870: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7890: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
78a0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
78b0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
78c0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
78d0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
78e0: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
78f0: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
7900: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7910: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
7920: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
7930: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
7940: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
7950: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
7960: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
7970: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
7980: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
7990: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
79a0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
79b0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
79c0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
79d0: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
79e0: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
79f0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
7a00: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
7a10: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
7a20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7a30: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
7a40: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
7a50: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7a60: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
7a70: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
7a80: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
7a90: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
7aa0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
7ab0: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
7ac0: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
7ad0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
7ae0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7af0: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
7b00: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
7b10: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
7b20: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
7b30: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
7b60: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
7b70: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
7b80: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
7b90: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
7ba0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
7bb0: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
7bc0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
7bd0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
7be0: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7bf0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7c00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7c10: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
7c20: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
7c30: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
7c40: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7c50: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
7c60: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7c70: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7c80: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7c90: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7ca0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7cb0: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7cc0: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7cd0: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7ce0: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7cf0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7d00: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
7d10: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
7d20: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
7d30: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
7d40: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
7d50: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
7d60: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7d70: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7d80: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7d90: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7da0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7db0: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7dc0: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7dd0: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7de0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7df0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7e00: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
7e10: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
7e20: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
7e30: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
7e40: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
7e50: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
7e60: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7e70: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7e80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7e90: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7ea0: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7eb0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7ec0: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7ed0: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7ee0: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7ef0: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7f00: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
7f10: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
7f20: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
7f30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
7f50: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
7f60: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7f70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7f80: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7f90: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7fa0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7fb0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7fd0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7fe0: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7ff0: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
8000: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
8010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
8020: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
8030: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
8040: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
8050: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
8060: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
8070: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
8080: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
8090: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
80a0: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
80b0: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
80c0: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
80d0: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
80e0: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
80f0: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
8100: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
8110: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
8120: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
8130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
8140: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
8150: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
8160: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
8170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
81d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
8240: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
8250: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
8260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8270: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
8280: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
8290: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
82a0: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
82b0: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
82c0: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
82d0: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
82e0: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
82f0: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
8300: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
8310: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
8320: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
8330: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
8340: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
8350: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
8360: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
8370: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
8380: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
8390: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
83a0: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
83b0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
83c0: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
83d0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
83e0: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
83f0: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
8400: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
8410: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
8420: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
8430: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
8440: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
8450: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
8460: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
8470: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
8480: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
8490: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
84a0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
84b0: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
84c0: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
84d0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
84e0: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
84f0: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
8500: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
8510: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
8520: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
8530: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
8540: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
8550: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
8560: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
8570: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
8580: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
8590: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
85a0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
85b0: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
85c0: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
85d0: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
85e0: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
85f0: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
8600: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
8610: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
8620: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
8630: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
8640: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
8650: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
8660: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
8670: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
8680: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
8690: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
86a0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
86b0: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
86c0: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
86d0: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
86e0: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
86f0: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
8700: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
8710: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
8720: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
8730: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
8740: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
8750: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
8760: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
8770: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
8780: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
8790: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
87a0: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
87b0: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
87c0: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
87d0: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
87e0: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
87f0: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
8800: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
8810: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
8820: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
8830: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
8840: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
8850: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
8860: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
8870: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8880: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
8890: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
88a0: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
88b0: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
88c0: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
88d0: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
88e0: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
88f0: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
8900: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
8910: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
8920: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
8930: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
8940: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
8950: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
8960: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
8970: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
8980: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
8990: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
89a0: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
89b0: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
89c0: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
89d0: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
89e0: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
89f0: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
8a00: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
8a10: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
8a20: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
8a30: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
8a40: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
8a50: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
8a60: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
8a70: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
8a80: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
8a90: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8aa0: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
8ab0: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
8ac0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
8ad0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8ae0: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
8af0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
8b00: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
8b10: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
8b20: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
8b30: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8b40: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
8b50: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
8b60: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
8b70: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
8b80: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
8b90: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
8ba0: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
8bb0: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
8bc0: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
8bd0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8be0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8bf0: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8c00: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
8c10: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
8c20: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
8c30: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
8c40: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
8c50: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
8c60: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8c70: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8c80: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8c90: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8ca0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8cb0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8cc0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8cd0: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8ce0: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8cf0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8d00: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
8d10: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
8d20: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
8d30: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
8d40: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
8d50: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
8d60: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8d70: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8d80: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8d90: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8da0: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8db0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8dc0: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8dd0: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8de0: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8df0: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8e00: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
8e10: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
8e20: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
8e30: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
8e40: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
8e50: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
8e60: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8e70: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8e80: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8e90: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8ea0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8eb0: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8ec0: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8ed0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8ee0: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8ef0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8f00: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
8f10: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8f20: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
8f30: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
8f40: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
8f50: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
8f60: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8f70: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8f80: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8f90: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8fa0: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8fb0: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8fc0: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8fd0: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8fe0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8ff0: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
9000: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
9010: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
9020: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
9030: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
9040: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
9050: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
9060: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
9070: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
9080: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
9090: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
90a0: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
90b0: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
90c0: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
90d0: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
90e0: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
90f0: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
9100: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
9110: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
9120: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
9130: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
9140: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
9150: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
9160: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
9170: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
9180: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
9190: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
91a0: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
91b0: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
91c0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
91d0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
91e0: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
91f0: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
9200: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
9210: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
9220: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
9230: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
9240: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
9250: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
9260: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
9270: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
9280: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
9290: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
92a0: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
92b0: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
92c0: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
92d0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
92e0: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
92f0: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
9300: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
9310: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
9320: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
9330: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
9340: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
9350: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
9360: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
9370: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
9380: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
9390: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
93a0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
93b0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
93c0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
93d0: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
93e0: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
93f0: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
9400: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
9410: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
9420: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
9430: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
9440: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
9450: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
9460: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
9470: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
9480: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
9490: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
94a0: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
94b0: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
94c0: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
94d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
94e0: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
94f0: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
9500: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
9510: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9520: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
9530: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
9540: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
9550: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
9560: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
9570: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
9580: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
9590: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
95c0: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
95d0: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
95e0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
95f0: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
9600: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
9610: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  . */.#else.  /* 
9620: 57 65 20 61 72 65 20 74 6f 6c 64 20 74 68 61 74  We are told that
9630: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
9640: 66 20 41 6e 64 72 6f 69 64 20 63 6f 6e 74 61 69  f Android contai
9650: 6e 20 61 20 62 75 67 20 74 68 61 74 0a 20 20 2a  n a bug that.  *
9660: 2a 20 73 69 7a 65 73 20 69 6e 6f 5f 74 20 61 74  * sizes ino_t at
9670: 20 6f 6e 6c 79 20 33 32 2d 62 69 74 73 20 69 6e   only 32-bits in
9680: 73 74 65 61 64 20 6f 66 20 36 34 2d 62 69 74 73  stead of 64-bits
9690: 2e 20 28 53 65 65 0a 20 20 2a 2a 20 68 74 74 70  . (See.  ** http
96a0: 73 3a 2f 2f 61 6e 64 72 6f 69 64 2d 72 65 76 69  s://android-revi
96b0: 65 77 2e 67 6f 6f 67 6c 65 73 6f 75 72 63 65 2e  ew.googlesource.
96c0: 63 6f 6d 2f 23 2f 63 2f 31 31 35 33 35 31 2f 33  com/#/c/115351/3
96d0: 2f 64 69 73 74 2f 73 71 6c 69 74 65 33 2e 63 29  /dist/sqlite3.c)
96e0: 0a 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  .  ** To work ar
96f0: 6f 75 6e 64 20 74 68 69 73 2c 20 61 6c 77 61 79  ound this, alway
9700: 73 20 61 6c 6c 6f 63 61 74 65 20 36 34 2d 62 69  s allocate 64-bi
9710: 74 73 20 66 6f 72 20 74 68 65 20 69 6e 6f 64 65  ts for the inode
9720: 20 6e 75 6d 62 65 72 2e 20 20 0a 20 20 2a 2a 20   number.  .  ** 
9730: 4f 6e 20 73 6d 61 6c 6c 20 6d 61 63 68 69 6e 65  On small machine
9740: 73 20 74 68 61 74 20 6f 6e 6c 79 20 68 61 76 65  s that only have
9750: 20 33 32 2d 62 69 74 20 69 6e 6f 64 65 73 2c 20   32-bit inodes, 
9760: 74 68 69 73 20 77 61 73 74 65 73 20 34 20 62 79  this wastes 4 by
9770: 74 65 73 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  tes,.  ** but th
9780: 61 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  at should not be
9790: 20 61 20 62 69 67 20 64 65 61 6c 2e 20 2a 2f 0a   a big deal. */.
97a0: 20 20 2f 2a 20 57 41 53 3a 20 20 69 6e 6f 5f 74    /* WAS:  ino_t
97b0: 20 69 6e 6f 3b 20 20 20 2a 2f 0a 20 20 75 36 34   ino;   */.  u64
97c0: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
97d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65          /* Inode
97e0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69   number */.#endi
97f0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
9800: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
9810: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
9820: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
9830: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
9840: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20   inode..**.** A 
9850: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
9860: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
9870: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
9880: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
9890: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
98a0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
98b0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
98c0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
98d0: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
98e0: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
98f0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
9900: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
9910: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a  ing to it..**.**
9920: 20 4d 75 74 65 78 20 72 75 6c 65 73 3a 0a 2a 2a   Mutex rules:.**
9930: 0a 2a 2a 20 20 28 31 29 20 4f 6e 6c 79 20 74 68  .**  (1) Only th
9940: 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d 75 74  e pLockMutex mut
9950: 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
9960: 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 61 64  in order to read
9970: 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 20 20 20   or write.**    
9980: 20 20 61 6e 79 20 6f 66 20 74 68 65 20 6c 6f 63    any of the loc
9990: 6b 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 20  king fields:.** 
99a0: 20 20 20 20 20 20 20 20 20 6e 53 68 61 72 65 64           nShared
99b0: 2c 20 6e 4c 6f 63 6b 2c 20 65 46 69 6c 65 4c 6f  , nLock, eFileLo
99c0: 63 6b 2c 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  ck, bProcessLock
99d0: 2c 20 70 55 6e 75 73 65 64 0a 2a 2a 0a 2a 2a 20  , pUnused.**.** 
99e0: 20 28 32 29 20 57 68 65 6e 20 6e 52 65 66 3e 30   (2) When nRef>0
99f0: 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
9a00: 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
9a10: 75 6e 63 68 61 6e 67 69 6e 67 20 61 6e 64 20 63  unchanging and c
9a20: 61 6e 0a 2a 2a 20 20 20 20 20 20 62 65 20 72 65  an.**      be re
9a30: 61 64 20 28 62 75 74 20 6e 6f 74 20 77 72 69 74  ad (but not writ
9a40: 74 65 6e 29 20 77 69 74 68 6f 75 74 20 68 6f 6c  ten) without hol
9a50: 64 69 6e 67 20 61 6e 79 20 6d 75 74 65 78 3a 0a  ding any mutex:.
9a60: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  **          file
9a70: 49 64 2c 20 70 4c 6f 63 6b 4d 75 74 65 78 0a 2a  Id, pLockMutex.*
9a80: 2a 0a 2a 2a 20 20 28 33 29 20 57 69 74 68 20 74  *.**  (3) With t
9a90: 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20 61 62  he exceptions ab
9aa0: 6f 76 65 2c 20 61 6c 6c 20 74 68 65 20 66 69 65  ove, all the fie
9ab0: 6c 64 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lds may only be 
9ac0: 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 6f 72 20  read.**      or 
9ad0: 77 72 69 74 74 65 6e 20 77 68 69 6c 65 20 68 6f  written while ho
9ae0: 6c 64 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c  lding the global
9af0: 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74   unixBigLock mut
9b00: 65 78 2e 0a 2a 2a 0a 2a 2a 20 44 65 61 64 6c 6f  ex..**.** Deadlo
9b10: 63 6b 20 70 72 65 76 65 6e 74 69 6f 6e 3a 20 20  ck prevention:  
9b20: 54 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42  The global unixB
9b30: 69 67 4c 6f 63 6b 20 6d 75 74 65 78 20 6d 61 79  igLock mutex may
9b40: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 63 71 75 69   not.** be acqui
9b50: 72 65 64 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  red while holdin
9b60: 67 20 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78  g the pLockMutex
9b70: 20 6d 75 74 65 78 2e 20 20 49 66 20 62 6f 74 68   mutex.  If both
9b80: 20 75 6e 69 78 42 69 67 4c 6f 63 6b 0a 2a 2a 20   unixBigLock.** 
9b90: 61 6e 64 20 70 4c 6f 63 6b 4d 75 74 65 78 20 61  and pLockMutex a
9ba0: 72 65 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  re needed, then 
9bb0: 75 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 73 74  unixBigLock must
9bc0: 20 62 65 20 61 63 71 75 69 72 65 64 20 66 69 72   be acquired fir
9bd0: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  st..*/.struct un
9be0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9bf0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
9c00: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
9c10: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
9c20: 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  y */.  sqlite3_m
9c30: 75 74 65 78 20 2a 70 4c 6f 63 6b 4d 75 74 65 78  utex *pLockMutex
9c40: 3b 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64 20 74  ;      /* Hold t
9c50: 68 69 73 20 6d 75 74 65 78 20 66 6f 72 2e 2e 2e  his mutex for...
9c60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65   */.  int nShare
9c70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9c80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9c90: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
9ca0: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
9cb0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
9ce0: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
9cf0: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
9d00: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
9d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
9d20: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
9d30: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
9d40: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
9d50: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
9d60: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ck;       /* An 
9d70: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9d80: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
9d90: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
9da0: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
9db0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
9dc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
9dd0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
9de0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
9e10: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
9e20: 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78  ucture */.  unix
9e30: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
9e40: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
9e50: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
9e60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
9e70: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  s inode */.  uni
9e80: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
9e90: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
9ea0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
9eb0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
9ec0: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
9ed0: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
9ee0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
9ef0: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
9f00: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
9f10: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
9f20: 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  LE.  unsigned lo
9f30: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
9f40: 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20  te;  /* for AFP 
9f50: 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64  simulated shared
9f60: 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a   lock */.#endif.
9f70: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
9f80: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20   /* Named POSIX 
9fb0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63  semaphore */.  c
9fc0: 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58  har aSemName[MAX
9fd0: 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f  _PATHNAME+2];  /
9fe0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
9ff0: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
a000: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
a010: 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a  _SHARED_MAPPING.
a020: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
a030: 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67 3b 20  nSharedMapping; 
a040: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 70    /* Size of map
a050: 70 65 64 20 72 65 67 69 6f 6e 20 69 6e 20 62 79  ped region in by
a060: 74 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  tes */.  void *p
a070: 53 68 61 72 65 64 4d 61 70 70 69 6e 67 3b 20 20  SharedMapping;  
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
a090: 72 79 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ry mapped region
a0a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
a0b0: 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20  *.** A lists of 
a0c0: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
a0d0: 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  o objects..**.**
a0e0: 20 4d 75 73 74 20 68 6f 6c 64 20 75 6e 69 78 42   Must hold unixB
a0f0: 69 67 4c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  igLock in order 
a100: 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
a110: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 0a   this variable..
a120: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
a130: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
a140: 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41 6c 6c 20  st = 0;  /* All 
a150: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a160: 6a 65 63 74 73 20 2a 2f 0a 0a 23 69 66 64 65 66  jects */..#ifdef
a170: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
a180: 0a 2a 2a 20 54 72 75 65 20 69 66 20 74 68 65 20  .** True if the 
a190: 69 6e 6f 64 65 20 6d 75 74 65 78 20 28 6f 6e 20  inode mutex (on 
a1a0: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 70 46 69  the unixFile.pFi
a1b0: 6c 65 4d 75 74 65 78 20 66 69 65 6c 64 29 20 69  leMutex field) i
a1c0: 73 20 68 65 6c 64 2c 20 6f 72 20 6e 6f 74 2e 0a  s held, or not..
a1d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a1e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
a1f0: 68 69 6e 20 61 73 73 65 72 74 28 29 20 74 6f 20  hin assert() to 
a200: 68 65 6c 70 20 76 65 72 69 66 79 20 63 6f 72 72  help verify corr
a210: 65 63 74 20 6d 75 74 65 78 0a 2a 2a 20 75 73 61  ect mutex.** usa
a220: 67 65 2e 0a 2a 2f 0a 69 6e 74 20 75 6e 69 78 46  ge..*/.int unixF
a230: 69 6c 65 4d 75 74 65 78 48 65 6c 64 28 75 6e 69  ileMutexHeld(uni
a240: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a250: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
a260: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75  pInode );.  retu
a270: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
a280: 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 70 49 6e  _held(pFile->pIn
a290: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
a2a0: 3b 0a 7d 0a 69 6e 74 20 75 6e 69 78 46 69 6c 65  ;.}.int unixFile
a2b0: 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 75 6e 69  MutexNotheld(uni
a2c0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a2d0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
a2e0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75  pInode );.  retu
a2f0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
a300: 5f 6e 6f 74 68 65 6c 64 28 70 46 69 6c 65 2d 3e  _notheld(pFile->
a310: 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
a320: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ex);.}.#endif../
a330: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
a340: 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45  ction - unixLogE
a350: 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73  rrorAtLine(), is
a360: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
a370: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
a380: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
a390: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
a3a0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
a3b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
a3c0: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
a3d0: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
a3e0: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
a3f0: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
a400: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
a410: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a420: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
a430: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
a440: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
a450: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
a460: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
a470: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
a480: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
a490: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
a4a0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
a4b0: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
a4c0: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
a4d0: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
a4e0: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
a4f0: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
a500: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
a510: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
a520: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
a530: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
a540: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
a550: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
a560: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
a570: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
a580: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
a590: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
a5a0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
a5b0: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
a5c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
a5d0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
a5e0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
a5f0: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
a600: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
a610: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
a620: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
a630: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
a640: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
a650: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
a660: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
a670: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
a680: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
a690: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
a6a0: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
a6b0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
a6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
a6d0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
a6e0: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
a6f0: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
a720: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
a730: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
a740: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a760: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
a770: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
a780: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
a790: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
a7a0: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
a7b0: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
a7c0: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
a7d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
a7e0: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
a7f0: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
a800: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
a810: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
a820: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
a830: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
a840: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
a850: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
a860: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
a870: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
a880: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
a890: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
a8a0: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
a8b0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
a8c0: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
a8d0: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
a8e0: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
a8f0: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
a900: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
a910: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
a920: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
a930: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
a940: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
a950: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
a960: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
a970: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
a980: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
a990: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
a9a0: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
a9b0: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
a9c0: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
a9d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
a9e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
a9f0: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
aa00: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
aa10: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
aa20: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
aa30: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
aa40: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
aa50: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
aa60: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
aa70: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
aa80: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
aa90: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
aaa0: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
aab0: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
aac0: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
aad0: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
aae0: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
aaf0: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
ab00: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
ab10: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
ab20: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
ab30: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
ab40: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
ab50: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
ab60: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
ab70: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
ab80: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
ab90: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
aba0: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
abb0: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
abc0: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
abd0: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
abe0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
abf0: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
ac00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
ac10: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
ac20: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
ac30: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
ac40: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
ac50: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
ac60: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
ac70: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
ac80: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
ac90: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
aca0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
acb0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
acc0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
acd0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
ace0: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
acf0: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
ad00: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
ad10: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
ad20: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
ad30: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
ad40: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
ad50: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
ad60: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
ad70: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
ad80: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
ad90: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
ada0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
adb0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
adc0: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
add0: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
ade0: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
adf0: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
ae00: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
ae10: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
ae20: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
ae30: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
ae40: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
ae50: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
ae60: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
ae70: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
ae80: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
ae90: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
aea0: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
aeb0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
aec0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
aed0: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
aee0: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
aef0: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
af00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
af10: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
af20: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
af30: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
af40: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
af50: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
af60: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
af70: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
af80: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
af90: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
afa0: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
afb0: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
afc0: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
afd0: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
afe0: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
aff0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
b000: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
b010: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
b040: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
b050: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
b060: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46  /*.** Set the pF
b070: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20  ile->lastErrno. 
b080: 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   Do this in a su
b090: 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74  broutine as that
b0a0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63   provides.** a c
b0b0: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
b0c0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
b0d0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
b0e0: 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72  oid storeLastErr
b0f0: 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  no(unixFile *pFi
b100: 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a  le, int error){.
b110: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b120: 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f  no = error;.}../
b130: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
b140: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
b150: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
b160: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
b170: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
b180: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
b190: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
b1a0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
b1b0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
b1c0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
b1d0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
b1e0: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
b1f0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
b200: 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  xt;.  assert( un
b210: 69 78 46 69 6c 65 4d 75 74 65 78 48 65 6c 64 28  ixFileMutexHeld(
b220: 70 46 69 6c 65 29 20 29 3b 0a 20 20 66 6f 72 28  pFile) );.  for(
b230: 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  p=pInode->pUnuse
b240: 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  d; p; p=pNext){.
b250: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
b260: 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74  Next;.    robust
b270: 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d  _close(pFile, p-
b280: 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  >fd, __LINE__);.
b290: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b2a0: 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64  (p);.  }.  pInod
b2b0: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
b2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
b2d0: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
b2e0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
b2f0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
b300: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
b310: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 67 6c  ()..**.** The gl
b320: 6f 62 61 6c 20 6d 75 74 65 78 20 6d 75 73 74 20  obal mutex must 
b330: 62 65 20 68 65 6c 64 20 77 68 65 6e 20 74 68 69  be held when thi
b340: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b350: 6c 65 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  led, but the mut
b360: 65 78 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 6f  ex.** on the ino
b370: 64 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  de being deleted
b380: 20 6d 75 73 74 20 4e 4f 54 20 62 65 20 68 65 6c   must NOT be hel
b390: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
b3a0: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
b3b0: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
b3c0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
b3d0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
b3e0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
b3f0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
b400: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73  xHeld() );.  ass
b410: 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74  ert( unixFileMut
b420: 65 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29  exNotheld(pFile)
b430: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
b440: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
b450: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
b460: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
b470: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
b480: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
b490: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
b4a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
b4b0: 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 20  ARED_MAPPING.   
b4c0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
b4d0: 53 68 61 72 65 64 4d 61 70 70 69 6e 67 20 29 7b  SharedMapping ){
b4e0: 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  .        osMunma
b4f0: 70 28 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65  p(pInode->pShare
b500: 64 4d 61 70 70 69 6e 67 2c 20 70 49 6e 6f 64 65  dMapping, pInode
b510: 2d 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67  ->nSharedMapping
b520: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
b530: 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69 6e  e->pSharedMappin
b540: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
b550: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d 61  Inode->nSharedMa
b560: 70 70 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  pping = 0;.     
b570: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
b580: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
b590: 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
b5a0: 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 63  kMutex);.      c
b5b0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
b5c0: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
b5d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
b5e0: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
b5f0: 74 65 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tex);.      if( 
b600: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
b610: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b620: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
b630: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
b640: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b650: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
b660: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
b670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b680: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
b690: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
b6a0: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
b6b0: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
b6c0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
b6d0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
b6e0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
b6f0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
b700: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
b710: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
b720: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
b730: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
b740: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
b750: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
b760: 5f 66 72 65 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  _free(pInode->pL
b770: 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  ockMutex);.     
b780: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
b790: 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  node);.    }.  }
b7a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b7b0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
b7c0: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
b7d0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
b7e0: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
b7f0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
b800: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
b810: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
b820: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
b830: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
b840: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
b850: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
b860: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
b870: 20 54 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   The global mute
b880: 78 20 6d 75 73 74 20 68 65 6c 64 20 77 68 65 6e  x must held when
b890: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
b8a0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  utine..**.** Ret
b8b0: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
b8c0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
b8d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
b8e0: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
b8f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b910: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
b920: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
b930: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
b940: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
b950: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
b960: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
b970: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
b980: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
b990: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b9b0: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
b9c0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
b9d0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
b9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b9f0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
ba00: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
ba10: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
ba20: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
ba30: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
ba40: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
ba50: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
ba60: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
ba70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
ba80: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
ba90: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
baa0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
bab0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
bac0: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
bad0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
bae0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
baf0: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
bb00: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
bb10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
bb20: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
bb30: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
bb40: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
bb50: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
bb60: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
bb70: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
bb80: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
bb90: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
bba0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
bbb0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
bbc0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66  ile, errno);.#if
bbd0: 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c   defined(EOVERFL
bbe0: 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  OW) && defined(S
bbf0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
bc00: 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  S).    if( pFile
bc10: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
bc20: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
bc30: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
bc40: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
bc50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
bc60: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
bc70: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
bc80: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
bc90: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
bca0: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
bcb0: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
bcc0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
bcd0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
bce0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
bcf0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
bd00: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
bd10: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
bd20: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
bd30: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
bd40: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
bd50: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
bd60: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
bd70: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
bd80: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
bd90: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
bda0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
bdb0: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
bdc0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
bdd0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
bde0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
bdf0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
be00: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
be10: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
be20: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
be30: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
be40: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
be50: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
be60: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
be70: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
be80: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
be90: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
bea0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
beb0: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
bec0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
bed0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
bee0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
bef0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
bf00: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
bf10: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
bf20: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
bf30: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
bf40: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
bf50: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
bf60: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
bf70: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
bf80: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
bf90: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
bfa0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
bfb0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
bfc0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
bfd0: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
bfe0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
bff0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
c000: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
c010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c020: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
c030: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
c040: 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65  &fileId, 0, size
c050: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66  of(fileId));.  f
c060: 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74  ileId.dev = stat
c070: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
c080: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c  OS_VXWORKS.  fil
c090: 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  eId.pId = pFile-
c0a0: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69  >pId;.#else.  fi
c0b0: 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29  leId.ino = (u64)
c0c0: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
c0d0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
c0e0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
c0f0: 20 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69   );.  pInode = i
c100: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
c110: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
c120: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
c130: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
c140: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
c150: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
c160: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
c170: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
c180: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
c190: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
c1a0: 34 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  4( sizeof(*pInod
c1b0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
c1c0: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
c1d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c1e0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
c1f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
c200: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
c210: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
c220: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
c230: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
c240: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
c250: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
c260: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
c270: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Mutex ){.      p
c280: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
c290: 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
c2a0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
c2b0: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
c2c0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4c    if( pInode->pL
c2d0: 6f 63 6b 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  ockMutex==0 ){. 
c2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
c2f0: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
c300: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c310: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
c320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c330: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
c340: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75  1;.    assert( u
c350: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
c360: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
c370: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
c380: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
c390: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
c3a0: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
c3b0: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
c3c0: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
c3d0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
c3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
c3f0: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
c400: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
c410: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
c420: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c430: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
c440: 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20   pFile has been 
c450: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
c460: 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73  ked since it was
c470: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a   first opened..*
c480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
c490: 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69  eHasMoved(unixFi
c4a0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20  le *pFile){.#if 
c4b0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
c4c0: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  urn pFile->pInod
c4d0: 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70  e!=0 && pFile->p
c4e0: 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  Id!=pFile->pInod
c4f0: 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23  e->fileId.pId;.#
c500: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
c510: 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e  at buf;.  return
c520: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
c530: 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74  0 &&.      (osSt
c540: 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  at(pFile->zPath,
c550: 20 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20   &buf)!=0 .     
c560: 20 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e      || (u64)buf.
c570: 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70  st_ino!=pFile->p
c580: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
c590: 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  o);.#endif.}.../
c5a0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69  *.** Check a uni
c5b0: 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20  xFile that is a 
c5c0: 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66  database.  Verif
c5d0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  y the following:
c5e0: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65  .**.** (1) There
c5f0: 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
c600: 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65  hard link on the
c610: 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65   file.** (2) The
c620: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73   file is not a s
c630: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20  ymbolic link.** 
c640: 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73  (3) The file has
c650: 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65   not been rename
c660: 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a  d or unlinked.**
c670: 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65  .** Issue sqlite
c680: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
c690: 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67  NING,...) messag
c6a0: 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  es if anything i
c6b0: 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a  s not right..*/.
c6c0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69  static void veri
c6d0: 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c  fyDbFile(unixFil
c6e0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72  e *pFile){.  str
c6f0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
c700: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
c710: 65 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ese verification
c720: 73 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65  s occurs for the
c730: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
c740: 6e 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  nly */.  if( pFi
c750: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
c760: 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
c770: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20  ) return;..  rc 
c780: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
c790: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
c7a0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
c7b0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c7c0: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
c7d0: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
c7e0: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
c7f0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
c800: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
c810: 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  _nlink==0 ){.   
c820: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c830: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
c840: 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c  le unlinked whil
c850: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
c860: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c870: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
c880: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31  ( buf.st_nlink>1
c890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c8a0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
c8b0: 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69  NG, "multiple li
c8c0: 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22  nks to file: %s"
c8d0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
c8e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c8f0: 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f  .  if( fileHasMo
c900: 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ved(pFile) ){.  
c910: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c920: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
c930: 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c  ile renamed whil
c940: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
c950: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c960: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a  return;.  }.}...
c970: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c980: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c990: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c9a0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c9b0: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c9c0: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c9d0: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c9e0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c9f0: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
ca00: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
ca10: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
ca20: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
ca30: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
ca40: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
ca50: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
ca60: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
ca70: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
ca80: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
ca90: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
caa0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
cab0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
cac0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
cad0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
cae0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
caf0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
cb00: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
cb10: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
cb20: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
cb30: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
cb40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
cb50: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
cb60: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
cb70: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
cb80: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
cb90: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
cba0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  D_LOCK );.  sqli
cbb0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
cbc0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
cbd0: 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  LockMutex);..  /
cbe0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
cbf0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
cc00: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
cc10: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
cc20: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
cc30: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
cc40: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
cc50: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
cc60: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
cc70: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
cc80: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
cc90: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
cca0: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
ccb0: 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c  eserved && !pFil
ccc0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
ccd0: 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  essLock ){.    s
cce0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
ccf0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
cd00: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
cd10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
cd20: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
cd30: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
cd40: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
cd50: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
cd60: 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  .    if( osFcntl
cd70: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
cd80: 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  LK, &lock) ){.  
cd90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cda0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
cdb0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
cdc0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
cdd0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
cde0: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
cdf0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
ce00: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
ce10: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
ce20: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71  }.#endif.  .  sq
ce30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ce40: 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  e(pFile->pInode-
ce50: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
ce60: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
ce70: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
ce80: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
ce90: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
cea0: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
ceb0: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
cec0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ced0: 2a 2a 20 53 65 74 20 61 20 70 6f 73 69 78 2d 61  ** Set a posix-a
cee0: 64 76 69 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a  dvisory-lock..**
cef0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77  .** There are tw
cf00: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
cf10: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 66 20  is routine.  If 
cf20: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a  compiled with.**
cf30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
cf40: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65  ETLK_TIMEOUT the
cf50: 6e 20 74 68 65 20 72 6f 75 74 69 6e 65 20 68 61  n the routine ha
cf60: 73 20 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d  s an extra param
cf70: 65 74 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73  eter.** which is
cf80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
cf90: 75 6e 69 78 46 69 6c 65 2e 20 20 49 66 20 74 68  unixFile.  If th
cfa0: 65 20 75 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73  e unixFile->iBus
cfb0: 79 54 69 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75  yTimeout.** valu
cfc0: 65 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  e is set, then i
cfd0: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
cfe0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
cff0: 74 6f 20 77 61 69 74 20 62 65 66 6f 72 65 0a 2a  to wait before.*
d000: 2a 20 66 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f  * failing the lo
d010: 63 6b 2e 20 20 54 68 65 20 69 42 75 73 79 54 69  ck.  The iBusyTi
d020: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 61  meout value is a
d030: 6c 77 61 79 73 20 72 65 73 65 74 20 62 61 63 6b  lways reset back
d040: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65   to.** zero on e
d050: 61 63 68 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ach call..**.** 
d060: 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
d070: 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69  _SETLK_TIMEOUT i
d080: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74  s not defined, t
d090: 68 65 6e 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f  hen do a non-blo
d0a0: 63 6b 69 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74  cking.** attempt
d0b0: 20 74 6f 20 73 65 74 20 74 68 65 20 6c 6f 63 6b   to set the lock
d0c0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
d0d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
d0e0: 5f 54 49 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e  _TIMEOUT.# defin
d0f0: 65 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69  e osSetPosixAdvi
d100: 73 6f 72 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20  soryLock(h,x,t) 
d110: 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c  osFcntl(h,F_SETL
d120: 4b 2c 78 29 0a 23 65 6c 73 65 0a 73 74 61 74 69  K,x).#else.stati
d130: 63 20 69 6e 74 20 6f 73 53 65 74 50 6f 73 69 78  c int osSetPosix
d140: 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20  AdvisoryLock(.  
d150: 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
d160: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
d170: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
d180: 77 68 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68  which to take th
d190: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75  e lock */.  stru
d1a0: 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c  ct flock *pLock,
d1b0: 20 20 2f 2a 20 54 68 65 20 64 65 73 63 72 69 70    /* The descrip
d1c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tion of the lock
d1d0: 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
d1e0: 70 46 69 6c 65 20 20 20 20 20 20 20 2f 2a 20 53  pFile       /* S
d1f0: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67  tructure holding
d200: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a   timeout value *
d210: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
d220: 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c  osFcntl(h,F_SETL
d230: 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c  K,pLock);.  whil
d240: 65 28 20 72 63 3c 30 20 26 26 20 70 46 69 6c 65  e( rc<0 && pFile
d250: 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 3e 30  ->iBusyTimeout>0
d260: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79   ){.    /* On sy
d270: 73 74 65 6d 73 20 74 68 61 74 20 73 75 70 70 6f  stems that suppo
d280: 72 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20  rt some kind of 
d290: 62 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f  blocking file lo
d2a0: 63 6b 20 77 69 74 68 20 61 20 74 69 6d 65 6f 75  ck with a timeou
d2b0: 74 2c 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61  t,.    ** make a
d2c0: 70 70 72 6f 70 72 69 61 74 65 20 63 68 61 6e 67  ppropriate chang
d2d0: 65 73 20 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b  es here to invok
d2e0: 65 20 74 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20  e that blocking 
d2f0: 66 69 6c 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20  file lock.  On. 
d300: 20 20 20 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f     ** generic po
d310: 73 69 78 2c 20 68 6f 77 65 76 65 72 2c 20 74 68  six, however, th
d320: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 41  ere is no such A
d330: 50 49 2e 20 20 53 6f 20 77 65 20 73 69 6d 70 6c  PI.  So we simpl
d340: 79 20 74 72 79 20 74 68 65 0a 20 20 20 20 2a 2a  y try the.    **
d350: 20 6c 6f 63 6b 20 6f 6e 63 65 20 65 76 65 72 79   lock once every
d360: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74   millisecond unt
d370: 69 6c 20 65 69 74 68 65 72 20 74 68 65 20 74 69  il either the ti
d380: 6d 65 6f 75 74 20 65 78 70 69 72 65 73 2c 20 6f  meout expires, o
d390: 72 20 75 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74  r until.    ** t
d3a0: 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
d3b0: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65  ned. */.    usle
d3c0: 65 70 28 31 30 30 30 29 3b 0a 20 20 20 20 72 63  ep(1000);.    rc
d3d0: 20 3d 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53   = osFcntl(h,F_S
d3e0: 45 54 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20  ETLK,pLock);.   
d3f0: 20 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d   pFile->iBusyTim
d400: 65 6f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  eout--;.  }.  re
d410: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
d420: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
d430: 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54  LE_SETLK_TIMEOUT
d440: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   */.../*.** Atte
d450: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
d460: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
d470: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
d480: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
d490: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
d4a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
d4b0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
d4c0: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
d4d0: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
d4e0: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
d4f0: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
d500: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
d510: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
d520: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
d530: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
d540: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
d550: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
d560: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
d570: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
d580: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
d590: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
d5a0: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
d5b0: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
d5c0: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
d5d0: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
d5e0: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
d5f0: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
d600: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
d610: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
d620: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
d630: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
d640: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
d650: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
d660: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
d670: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
d680: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d690: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
d6a0: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
d6b0: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
d6c0: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
d6d0: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
d6e0: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
d6f0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
d700: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
d710: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
d720: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
d730: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
d740: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
d750: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
d760: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
d770: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
d780: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
d790: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
d7a0: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
d7b0: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
d7c0: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
d7d0: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
d7e0: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
d7f0: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
d800: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
d810: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
d820: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d830: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
d840: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
d850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d860: 64 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  d(pInode->pLockM
d870: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28  utex) );.  if( (
d880: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
d890: 20 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43   & (UNIXFILE_EXC
d8a0: 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  L|UNIXFILE_RDONL
d8b0: 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58  Y))==UNIXFILE_EX
d8c0: 43 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  CL ){.    if( pI
d8d0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
d8e0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
d8f0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
d900: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d910: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
d920: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
d930: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
d940: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
d950: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
d960: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
d970: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d980: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
d990: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
d9a0: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
d9b0: 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72  sSetPosixAdvisor
d9c0: 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  yLock(pFile->h, 
d9d0: 26 6c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20  &lock, pFile);. 
d9e0: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
d9f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
da00: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
da10: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
da20: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
da30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
da40: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
da50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
da60: 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76   = osSetPosixAdv
da70: 69 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d  isoryLock(pFile-
da80: 3e 68 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c 65  >h, pLock, pFile
da90: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
daa0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
dab0: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
dac0: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
dad0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
dae0: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
daf0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
db00: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
db10: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
db20: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
db30: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
db40: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
db50: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
db60: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
db70: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
db80: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
db90: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
dba0: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
dbb0: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
dbc0: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
dbd0: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
dbe0: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
dbf0: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
dc00: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
dc10: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
dc20: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
dc30: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
dc40: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
dc50: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
dc60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
dc70: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
dc80: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
dc90: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
dca0: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
dcb0: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
dcc0: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
dcd0: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
dce0: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
dcf0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
dd00: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
dd10: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
dd20: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
dd30: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
dd40: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
dd50: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
dd60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
dd70: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
dd80: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
dd90: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
dda0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
ddb0: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
ddc0: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
ddd0: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
dde0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
ddf0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
de00: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
de10: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
de20: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
de30: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
de40: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
de50: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
de60: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
de70: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
de80: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
de90: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
dea0: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
deb0: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
dec0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
ded0: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
dee0: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
def0: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
df00: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
df10: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
df20: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
df30: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
df40: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
df50: 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d  Windows95 system
df60: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
df70: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
df80: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
df90: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
dfa0: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
dfb0: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
dfc0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
dfd0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
dfe0: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
dff0: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
e000: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
e010: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
e020: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
e030: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
e040: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
e050: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
e060: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
e070: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
e080: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
e090: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
e0a0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
e0b0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
e0c0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
e0d0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
e0e0: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
e0f0: 75 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72  uccessful, 'shar
e100: 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69  ed byte range' i
e110: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20  s read-locked.  
e120: 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ** and the lock 
e130: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
e140: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20  byte' released. 
e150: 20 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20   (Legacy note:  
e160: 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65  When.  ** SQLite
e170: 20 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c   was first devel
e180: 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20  oped, Windows95 
e190: 73 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69  systems were sti
e1a0: 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a  ll very common,.
e1b0: 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73    ** and Widnows
e1c0: 39 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65  95 lacks a share
e1d0: 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74  d-lock capabilit
e1e0: 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77  y.  So on Window
e1f0: 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67  s95, a.  ** sing
e200: 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65  le randomly sele
e210: 63 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65  cted by from the
e220: 20 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61   'shared byte ra
e230: 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  nge' is locked..
e240: 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69    ** Windows95 i
e250: 73 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63  s now pretty muc
e260: 68 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74  h extinct, but t
e270: 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
e280: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63  for the.  ** lac
e290: 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b  k of shared-lock
e2a0: 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c  s on Windows95 l
e2b0: 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63  ives on, for bac
e2c0: 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70  kwards.  ** comp
e2d0: 61 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a  atibility.).  **
e2e0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
e2f0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
e300: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
e310: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
e320: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
e330: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
e340: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
e350: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
e360: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
e370: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
e380: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
e390: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
e3a0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
e3b0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
e3c0: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
e3d0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
e3e0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
e3f0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
e400: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
e410: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
e420: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
e430: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
e440: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
e450: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
e460: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
e470: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
e480: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
e490: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
e4a0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
e4b0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
e4c0: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
e4d0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
e4e0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
e4f0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
e500: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
e510: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
e520: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
e530: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
e540: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
e550: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
e560: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
e570: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
e580: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
e590: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
e5a0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
e5b0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
e5c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
e5d0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
e5e0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
e5f0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
e600: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
e610: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
e620: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
e630: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
e640: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
e650: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
e660: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
e670: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
e680: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f   database. .  */
e690: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e6a0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
e6b0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e6c0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
e6d0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
e6e0: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
e6f0: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
e700: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
e710: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
e720: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
e730: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
e740: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
e750: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
e760: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
e770: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
e780: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
e790: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
e7a0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
e7b0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
e7c0: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
e7d0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
e7e0: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
e7f0: 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0)));..  /* If t
e800: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
e810: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
e820: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
e830: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
e840: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
e850: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
e860: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
e870: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
e880: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
e890: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
e8a0: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
e8b0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e8c0: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
e8d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
e8e0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
e8f0: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
e900: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
e910: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
e920: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
e930: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
e940: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e950: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
e960: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
e970: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
e980: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
e990: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
e9a0: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
e9b0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
e9c0: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
e9d0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
e9e0: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
e9f0: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
ea00: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
ea10: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
ea20: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
ea30: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
ea40: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
ea50: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
ea60: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
ea70: 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
ea80: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
ea90: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
eaa0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
eab0: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
eac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
ead0: 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
eae0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
eaf0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
eb00: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
eb10: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
eb20: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
eb30: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
eb40: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
eb50: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f  eads.  */.  pIno
eb60: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
eb70: 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
eb80: 74 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65  tex_enter(pInode
eb90: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a  ->pLockMutex);..
eba0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
ebb0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
ebc0: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
ebd0: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
ebe0: 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
ebf0: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
ec00: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
ec10: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
ec20: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
ec30: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ec40: 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
ec50: 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20  ock && .        
ec60: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
ec70: 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
ec80: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
ec90: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
eca0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
ecb0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
ecc0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
ecd0: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
ece0: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
ecf0: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
ed00: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
ed10: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
ed20: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
ed30: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
ed40: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
ed50: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
ed60: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
ed70: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
ed80: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
ed90: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
eda0: 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e  .      (pInode->
edb0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
edc0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
edd0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
ede0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
edf0: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
ee00: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
ee10: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
ee20: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ee30: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
ee40: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
ee50: 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
ee60: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
ee70: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
ee80: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ee90: 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
eea0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
eeb0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
eec0: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
eed0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
eee0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
eef0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
ef00: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
ef10: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
ef20: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
ef30: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
ef40: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
ef50: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
ef60: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  sed..  */.  lock
ef70: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c  .l_len = 1L;.  l
ef80: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ef90: 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65  EEK_SET;.  if( e
efa0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
efb0: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
efc0: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
efd0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
efe0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
eff0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
f000: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
f010: 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d  e = (eFileLock==
f020: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
f030: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
f040: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f050: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
f060: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f070: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f080: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
f090: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
f0a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
f0b0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f0c0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
f0d0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
f0e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f0f0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
f100: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f110: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
f120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
f130: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
f140: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
f150: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
f160: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
f170: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
f180: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
f190: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
f1a0: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
f1b0: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
f1c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
f1d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
f1e0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
f1f0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
f200: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
f210: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
f220: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
f230: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
f240: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
f250: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
f260: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
f270: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f280: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
f290: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
f2a0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
f2b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f2c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
f2d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f2e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
f2f0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f300: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f310: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
f320: 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
f330: 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
f340: 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
f350: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
f360: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
f370: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
f380: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
f390: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f3a0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
f3b0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f3c0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63  le, &lock) && rc
f3d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f3e0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
f3f0: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
f400: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
f410: 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  /.      tErrno =
f420: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
f430: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f440: 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a  UNLOCK; .    }..
f450: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f460: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f470: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
f480: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f490: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f4a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f4b0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
f4c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f4d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f4e0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
f4f0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
f500: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
f510: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
f520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
f530: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
f540: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
f550: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
f560: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
f570: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
f580: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
f590: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
f5a0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
f5b0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
f5c0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
f5d0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
f5e0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
f5f0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
f600: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
f610: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
f620: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
f630: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
f640: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
f650: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
f660: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
f670: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
f680: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
f690: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
f6a0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
f6b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
f6c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f6d0: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
f6e0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
f6f0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
f700: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
f710: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
f720: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
f730: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
f740: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
f750: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
f760: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
f770: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
f780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
f790: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f7a0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f7b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f7c0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f7d0: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
f7e0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f7f0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
f800: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f810: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f820: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
f830: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
f840: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
f850: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f860: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
f870: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
f880: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
f890: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
f8a0: 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66  }.  }.  ..#ifdef
f8b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
f8c0: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
f8d0: 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
f8e0: 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
f8f0: 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
f900: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
f910: 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
f920: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
f930: 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
f940: 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
f950: 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
f960: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
f970: 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
f980: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
f990: 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
f9a0: 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
f9b0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
f9c0: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
f9d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
f9e0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
f9f0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
fa00: 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20  RVED_LOCK.  ){. 
fa10: 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
fa20: 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ntrChng = 0;.   
fa30: 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
fa40: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
fa50: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
fa60: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
fa70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
fa80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
fa90: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
faa0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
fab0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
fac0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
fad0: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
fae0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
faf0: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
fb00: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
fb10: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
fb20: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
fb30: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
fb40: 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a  .  }..end_lock:.
fb50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fb60: 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  leave(pInode->pL
fb70: 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54  ockMutex);.  OST
fb80: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
fb90: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
fba0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
fbb0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
fbc0: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
fbd0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
fbe0: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
fbf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fc00: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
fc10: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
fc20: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
fc30: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
fc40: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
fc50: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
fc60: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
fc70: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
fc80: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
fc90: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
fca0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
fcb0: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
fcc0: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50  d *p = pFile->pP
fcd0: 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
fce0: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  d;.  assert( uni
fcf0: 78 46 69 6c 65 4d 75 74 65 78 48 65 6c 64 28 70  xFileMutexHeld(p
fd00: 46 69 6c 65 29 20 29 3b 0a 20 20 70 2d 3e 70 4e  File) );.  p->pN
fd10: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
fd20: 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
fd30: 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
fd40: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
fd50: 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f   pFile->pPreallo
fd60: 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b  catedUnused = 0;
fd70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
fd80: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fd90: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
fda0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
fdb0: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
fdc0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
fdd0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
fde0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
fdf0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
fe00: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
fe10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
fe20: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
fe30: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
fe40: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
fe50: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
fe60: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
fe70: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
fe80: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
fe90: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
fea0: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
feb0: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
fec0: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
fed0: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
fee0: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
fef0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
ff00: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
ff10: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
ff20: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
ff30: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
ff40: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
ff50: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
ff60: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
ff70: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
ff80: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
ff90: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
ffa0: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
ffb0: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
ffc0: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
ffd0: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
ffe0: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
fff0: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
10000 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10010 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
10020 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
10030 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
10040 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10050 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
10060 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
10070 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
10080 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
10090 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
100a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
100b0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
100c0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
100d0 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
100e0 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
100f0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
10100 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
10110 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
10120 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
10130 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
10140 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
10150 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
10160 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
10170 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
10180 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
10190 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
101a0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
101b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
101c0 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20  .  }.  pInode = 
101d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
101e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
101f0 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
10200 63 6b 4d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ckMutex);.  asse
10210 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
10220 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
10230 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10240 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
10250 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
10260 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
10270 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10280 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
10290 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
102a0 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
102b0 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
102c0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
102d0 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
102e0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
102f0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
10300 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
10310 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
10320 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
10330 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
10340 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
10350 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
10360 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
10370 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
10380 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
10390 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
103a0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
103b0 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
103c0 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
103d0 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
103e0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
103f0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
10400 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
10410 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
10420 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
10430 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
10440 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
10450 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
10460 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
10470 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
10480 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
10490 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
104a0 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
104b0 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
104c0 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
104d0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
104e0 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
104f0 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
10500 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
10510 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
10520 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
10530 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
10540 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
10550 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
10560 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
10570 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
10580 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
10590 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
105a0 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
105b0 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
105c0 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
105d0 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
105e0 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
105f0 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
10600 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
10610 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
10620 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10630 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  K ){.#if !define
10640 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
10650 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  !SQLITE_ENABLE_L
10660 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
10670 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e     (void)handleN
10680 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  FSUnlock;.      
10690 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46  assert( handleNF
106a0 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65  SUnlock==0 );.#e
106b0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
106c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
106d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
106e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
106f0 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e   if( handleNFSUn
10700 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
10710 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20  int tErrno;     
10720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
10730 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73  or code from sys
10740 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20  tem call errors 
10750 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
10760 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
10770 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
10780 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
10790 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
107a0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
107b0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
107c0 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
107d0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
107e0 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
107f0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10800 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
10810 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10820 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
10830 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
10840 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
10850 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
10860 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
10870 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
10880 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
10890 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
108a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
108b0 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
108c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
108d0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
108e0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
108f0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
10900 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
10910 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
10920 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
10930 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10940 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
10950 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10960 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
10970 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
10980 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
10990 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
109a0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
109b0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
109c0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
109d0 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
109e0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
109f0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
10a00 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
10a10 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
10a20 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
10a30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
10a40 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
10a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10a60 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10a70 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
10a80 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10a90 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
10aa0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10ab0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69   SHARED_FIRST+di
10ac0 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c  vSize;.        l
10ad0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
10ae0 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b  ED_SIZE-divSize;
10af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
10b00 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10b10 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
10b20 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
10b30 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
10b40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10b50 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
10b60 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
10b70 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
10b80 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
10b90 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10ba0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10bb0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
10bc0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
10bd0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
10be0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10bf0 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  TYLE */.      {.
10c00 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
10c10 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
10c20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
10c30 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10c40 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10c50 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
10c60 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
10c70 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
10c80 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
10c90 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10ca0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
10cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
10cc0 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61  n theory, the ca
10cd0 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f  ll to unixFileLo
10ce0 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ck() cannot fail
10cf0 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72   because another
10d00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
10d10 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
10d20 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
10d30 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65   lock. If it doe
10d40 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  s, this .       
10d50 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20     ** indicates 
10d60 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
10d70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
10d80 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b  llowing the lock
10d90 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
10da0 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68   protocol. If th
10db0 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75  is happens, retu
10dc0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
10dd0 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e  RDLOCK. Returnin
10de0 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53  g.          ** S
10df0 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64  QLITE_BUSY would
10e00 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70   confuse the upp
10e10 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61  er layer (in pra
10e20 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20  ctice it causes 
10e30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
10e40 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29   assert to fail)
10e50 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20  . */ .          
10e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10e70 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_RDLOCK;.      
10e80 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
10e90 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
10ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
10eb0 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
10ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10ed0 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
10ee0 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
10ef0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
10f00 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
10f10 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10f20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
10f30 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10f40 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
10f50 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
10f60 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
10f70 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10f80 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
10f90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
10fa0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
10fb0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
10fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
10fd0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10fe0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  _UNLOCK;.      s
10ff0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
11000 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
11010 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
11020 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
11030 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
11040 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
11050 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
11060 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
11070 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
11080 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
11090 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
110a0 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
110b0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
110c0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
110d0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
110e0 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
110f0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
11100 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
11110 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
11120 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
11130 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11140 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
11150 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
11160 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
11170 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
11180 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
11190 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
111a0 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
111b0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
111c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
111d0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
111e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
111f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11200 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74  LOCK;.        st
11210 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
11220 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
11230 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
11240 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
11250 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11260 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
11270 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
11280 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
11290 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
112a0 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
112b0 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
112c0 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
112d0 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
112e0 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
112f0 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
11300 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
11310 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
11320 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
11330 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
11340 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
11350 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
11360 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
11370 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
11380 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
11390 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65  nLock==0 ) close
113a0 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
113b0 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f  );.  }..end_unlo
113c0 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ck:.  sqlite3_mu
113d0 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
113e0 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
113f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11400 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
11410 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11420 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
11430 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11440 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
11450 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
11460 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
11470 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
11480 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
11490 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
114a0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
114b0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
114c0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
114d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
114e0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
114f0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
11500 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
11510 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
11520 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11530 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
11540 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
11550 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11560 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11570 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
11580 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11590 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
115a0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
115b0 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
115c0 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
115d0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
115e0 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
115f0 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
11600 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
11610 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
11620 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
11630 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
11640 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
11650 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  );.static void u
11660 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
11670 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e  xFile *pFd);.#en
11680 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
11690 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
116a0 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74  s the parts of t
116b0 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20  he "close file" 
116c0 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f  operation .** co
116d0 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
116e0 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20  ing schemes. It 
116f0 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63  closes the direc
11700 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a  tory and file.**
11710 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65   handles, if the
11720 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64  y are valid, and
11730 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73   sets all fields
11740 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
11750 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
11760 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   0..**.** It is 
11770 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20  *not* necessary 
11780 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
11790 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  x when this rout
117a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ine is called,.*
117b0 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b  * even on VxWork
117c0 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c  s.  A mutex will
117d0 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20   be acquired on 
117e0 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a  VxWorks by the.*
117f0 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  * vxworksRelease
11800 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65  FileId() routine
11810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11820 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71  closeUnixFile(sq
11830 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
11840 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11850 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11860 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  id;.#if SQLITE_M
11870 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
11880 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
11890 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
118a0 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
118b0 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  ){.    robust_cl
118c0 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
118d0 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
118e0 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
118f0 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58  1;.  }.#if OS_VX
11900 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c  WORKS.  if( pFil
11910 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66  e->pId ){.    if
11920 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
11930 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
11940 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73  LETE ){.      os
11950 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  Unlink(pFile->pI
11960 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
11970 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
11980 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
11990 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
119a0 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
119b0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
119c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c  ifdef SQLITE_UNL
119d0 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a  INK_AFTER_CLOSE.
119e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
119f0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
11a00 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
11a10 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
11a20 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  zPath);.    sqli
11a30 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a  te3_free(*(char*
11a40 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  *)&pFile->zPath)
11a50 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61  ;.    pFile->zPa
11a60 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  th = 0;.  }.#end
11a70 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
11a80 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
11a90 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
11aa0 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
11ab0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
11ac0 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
11ad0 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  edUnused);.  mem
11ae0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
11af0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
11b00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11b10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
11b20 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
11b30 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
11b40 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
11b50 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
11b60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11b70 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11b80 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
11b90 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
11ba0 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
11bb0 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 61 73 73  ->pInode;..  ass
11bc0 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
11bd0 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65  ;.  verifyDbFile
11be0 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55  (pFile);.  unixU
11bf0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
11c00 4b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  K);.  assert( un
11c10 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65  ixFileMutexNothe
11c20 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 75  ld(pFile) );.  u
11c30 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
11c40 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
11c50 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
11c60 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
11c70 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
11c80 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
11c90 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
11ca0 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
11cb0 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
11cc0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
11cd0 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
11ce0 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
11cf0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
11d00 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
11d10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11d20 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c  enter(pInode->pL
11d30 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28  ockMutex);.  if(
11d40 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29   pInode->nLock )
11d50 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
11d60 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
11d70 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
11d80 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
11d90 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
11da0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
11db0 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
11dc0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
11dd0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
11de0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
11df0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
11e00 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
11e10 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
11e20 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
11e30 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
11e40 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
11e50 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
11e60 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
11e70 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71  pFile);.  }.  sq
11e80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11e90 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  e(pInode->pLockM
11ea0 75 74 65 78 29 3b 0a 20 20 72 65 6c 65 61 73 65  utex);.  release
11eb0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
11ec0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
11ed0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
11ee0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11ef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11f00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
11f10 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
11f20 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
11f30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
11f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
11fa0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ff0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12010 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
12020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12040 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
12050 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
12060 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
12070 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
12080 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
12090 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
120a0 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
120b0 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
120c0 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
120d0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
120e0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
120f0 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
12100 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
12110 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
12120 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
12130 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
12140 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
12150 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
12160 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
12170 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
12180 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
12190 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
121a0 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
121b0 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
121c0 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
121d0 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
121e0 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
121f0 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
12200 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
12210 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12220 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
12230 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
12240 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
12250 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
12260 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
12270 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
12280 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
12290 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
122a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
122b0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
122c0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
122d0 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
122e0 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
122f0 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
12300 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
12310 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
12320 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
12330 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
12350 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
12360 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
12370 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
12380 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
12390 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
123a0 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
123b0 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
123c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
123d0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
123e0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
123f0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
12400 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
12410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12420 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
12430 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
12440 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
12450 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
12460 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12470 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
12480 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
12490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
124a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
124b0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
124c0 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
124d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
124e0 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
124f0 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a  _SHARED_MAPPING.
12500 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
12510 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12520 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 49 6e 6f  .  if( pFd->pIno
12530 64 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  de ){.    unixEn
12540 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
12550 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
12560 28 70 46 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  (pFd);.    unixL
12570 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
12580 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
12590 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
125a0 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
125c0 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
125d0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
125e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
125f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
126c0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
126f0 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
12700 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
12710 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
12720 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
12730 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
12740 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
12750 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
12760 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
12770 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
12780 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
12790 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
127a0 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
127b0 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
127c0 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
127d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
127e0 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
127f0 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
12800 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
12810 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
12820 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
12830 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
12840 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
12850 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
12860 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
12870 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
12880 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
12890 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
128a0 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
128b0 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
128c0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
128d0 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
128e0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
128f0 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
12900 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
12910 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
12920 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
12930 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
12940 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
12950 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
12960 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
12970 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
12980 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
12990 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
129a0 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
129b0 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
129c0 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
129d0 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
129e0 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
129f0 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
12a00 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
12a10 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
12a20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
12a30 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
12a40 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
12a50 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
12a60 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
12a70 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
12a80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
12a90 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
12aa0 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
12ab0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
12ac0 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
12ad0 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
12ae0 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
12af0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
12b00 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
12b10 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
12b20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
12b30 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
12b40 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
12b50 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
12b60 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
12b70 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12b80 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12b90 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
12ba0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
12bb0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
12bc0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
12bd0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
12be0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
12bf0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
12c00 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
12c10 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12c20 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
12c30 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
12c40 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
12c50 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
12c60 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
12c70 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
12c80 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
12c90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
12ca0 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
12cb0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
12cc0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
12cd0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
12ce0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
12cf0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
12d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
12d10 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
12d20 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12d30 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
12d40 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
12d50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12d60 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12d70 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12d80 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12d90 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
12da0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
12db0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
12dc0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
12dd0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
12de0 20 70 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65   pFile );.  rese
12df0 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28  rved = osAccess(
12e00 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
12e10 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
12e20 78 74 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54  xt, 0)==0;.  OST
12e30 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
12e40 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f  OCK %d %d %d (do
12e50 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
12e60 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
12e70 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  d));.  *pResOut 
12e80 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
12e90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12ea0 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
12eb0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
12ec0 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
12ed0 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
12ee0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
12ef0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
12f00 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
12f10 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
12f20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
12f30 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
12f40 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
12f50 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
12f60 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
12f70 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
12f80 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
12f90 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
12fa0 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
12fb0 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
12fc0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
12fd0 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
12fe0 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
12ff0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
13000 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
13010 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
13020 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
13030 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
13040 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
13050 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
13060 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
13070 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
13080 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
13090 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
130a0 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
130b0 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
130c0 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
130d0 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
130e0 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
130f0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13100 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13110 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
13120 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
13130 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
13140 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
13150 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13160 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
13170 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
13180 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
13190 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
131a0 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
131b0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a  cking level..**.
131c0 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20  ** With dotfile 
131d0 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c  locking, we real
131e0 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
131f0 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55  state (4): EXCLU
13200 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20  SIVE..** But we 
13210 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20  track the other 
13220 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69  locking levels i
13230 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74  nternally..*/.st
13240 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
13250 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13260 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13270 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
13280 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13290 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
132a0 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
132b0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
132c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
132d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
132e0 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65  OK;...  /* If we
132f0 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20   have any lock, 
13300 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69  then the lock fi
13310 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
13320 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a  s.  All we have.
13330 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64    ** to do is ad
13340 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61  just our interna
13350 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  l record of the 
13360 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f  lock level..  */
13370 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13380 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
13390 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
133a0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
133b0 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c  eLock;.    /* Al
133c0 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
133d0 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
133e0 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66   old file */.#if
133f0 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20  def HAVE_UTIME. 
13400 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69     utime(zLockFi
13410 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65  le, NULL);.#else
13420 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
13430 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
13440 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
13450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13460 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
13470 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
13480 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28  .  rc = osMkdir(
13490 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29  zLockFile, 0777)
134a0 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
134b0 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
134c0 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
134d0 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
134e0 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  */.    int tErrn
134f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
13500 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72  f( EEXIST == tEr
13510 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
13520 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
13530 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
13540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
13550 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
13560 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
13570 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
13580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13590 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
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 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
135d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
135e0 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
135f0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13600 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13610 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13620 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13640 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13650 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13660 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13670 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
13680 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
13690 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
136a0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
136b0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
136c0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
136d0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
136e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
136f0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13700 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13710 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13720 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13730 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13740 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
13750 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
13760 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
13770 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
13780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
13790 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
137a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
137b0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
137c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
137d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
137e0 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
137f0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
13800 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
13810 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
13820 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13830 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13840 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13850 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
13860 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
13870 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
13880 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
13890 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
138a0 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
138b0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
138c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
138d0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
138e0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
138f0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13900 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
13910 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13920 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
13930 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   To downgrade to
13940 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20   shared, simply 
13950 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
13960 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68  nal notion of th
13970 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  e.  ** lock stat
13980 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d  e.  No need to m
13990 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c  ess with the fil
139a0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  e on disk..  */.
139b0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
139c0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
139d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
139e0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
139f0 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
13a00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13a10 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
13a20 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
13a30 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
13a40 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
13a50 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
13a60 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  =NO_LOCK );.  rc
13a70 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b   = osRmdir(zLock
13a80 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c  File);.  if( rc<
13a90 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  0 ){.    int tEr
13aa0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13ab0 20 69 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f   if( tErrno==ENO
13ac0 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ENT ){.      rc 
13ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
13af0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
13b00 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
13b10 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
13b20 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
13b30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
13b40 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
13b50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
13b60 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
13b70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13b80 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20  * Close a file. 
13b90 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
13ba0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c  ock has been rel
13bb0 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f  eased before clo
13bc0 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
13bd0 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  int dotlockClose
13be0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13bf0 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  d) {.  unixFile 
13c00 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13c10 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74  le*)id;.  assert
13c20 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74  ( id!=0 );.  dot
13c30 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
13c40 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74  O_LOCK);.  sqlit
13c50 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
13c60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
13c70 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
13c80 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a  ixFile(id);.}./*
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ca0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
13cb0 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
13cc0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
13cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
13d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
13da0 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
13db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13dd0 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
13de0 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
13df0 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
13e00 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
13e10 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
13e20 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
13e30 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
13e40 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
13e50 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
13e60 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
13e70 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
13e80 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
13e90 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
13ea0 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
13eb0 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
13ec0 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
13ed0 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
13ee0 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
13ef0 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
13f00 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
13f10 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
13f20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
13f30 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
13f40 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
13f50 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
13f60 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
13f70 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
13f80 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
13f90 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
13fa0 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
13fb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
13fc0 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
13fd0 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53  ned off.*/.#if S
13fe0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
13ff0 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
14000 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
14010 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
14020 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
14030 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
14040 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
14050 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
14060 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
14070 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
14080 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
14090 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
140a0 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
140b0 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
140c0 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
140d0 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
140e0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
140f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14100 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
14110 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
14120 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
14130 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
14140 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
14150 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
14160 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
14170 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
14180 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
14190 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
141a0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
141b0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
141c0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
141d0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
141e0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
141f0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
14200 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
14210 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
14220 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
14230 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
14240 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14250 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
14260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14270 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
14280 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
14290 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
142a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
142b0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
142c0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
142d0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
142e0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
142f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14300 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
14310 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
14320 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
14330 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
14340 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14350 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
14360 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
14370 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
14380 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
14390 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
143a0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
143b0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
143c0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
143d0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
143e0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
143f0 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
14400 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
14410 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
14420 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
14430 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
14440 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
14450 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
14460 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
14470 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
14480 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
14490 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
144a0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
144b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
144c0 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
144d0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
144e0 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
144f0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
14500 4b 3b 20 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K; .        stor
14510 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
14520 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
14530 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
14540 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
14550 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
14560 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
14570 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
14580 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
14590 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65   else might have
145a0 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a   it reserved */.
145b0 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
145c0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
145d0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
145e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
145f0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ; .      if( IS_
14600 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
14610 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
14620 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
14630 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
14640 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
14650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14660 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14670 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14680 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
14690 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
146a0 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
146b0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
146c0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
146d0 69 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20  if( (rc & 0xff) 
146e0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
146f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14700 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
14710 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
14720 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
14730 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
14740 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
14750 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
14760 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14770 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
14780 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
14790 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
147a0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
147b0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
147c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
147d0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
147e0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
147f0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14800 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14810 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14820 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14830 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14840 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14850 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14860 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
14870 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
14880 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
14890 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
148a0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
148b0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
148c0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
148d0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
148e0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
148f0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14900 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14910 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14920 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14930 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14940 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14950 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14960 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14970 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14980 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14990 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
149a0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
149b0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
149c0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
149d0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
149e0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
149f0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14a00 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14a10 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14a20 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
14a30 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
14a40 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
14a50 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
14a60 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
14a70 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
14a80 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
14a90 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
14aa0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
14ab0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
14ac0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
14ad0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
14ae0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
14af0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
14b00 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
14b10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14b20 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
14b30 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
14b40 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
14b50 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
14b60 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
14b70 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
14b80 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
14b90 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14ba0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14bb0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
14bc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14bd0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14be0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
14c00 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
14c10 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
14c20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
14c30 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
14c40 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
14c50 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
14c60 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
14c70 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14c80 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
14c90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14ca0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14cb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14cc0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14cd0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
14ce0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
14cf0 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
14d00 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
14d10 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
14d20 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
14d30 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
14d40 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
14d50 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
14d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
14d70 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
14d80 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
14d90 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
14da0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
14db0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
14dc0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
14dd0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
14de0 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
14df0 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73      /* got it, s
14e00 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
14e10 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20  return ok */.   
14e20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14e30 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
14e40 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c   }.  OSTRACE(("L
14e50 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
14e60 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
14e70 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
14e80 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
14e90 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
14ea0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
14eb0 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64  "failed"));.#ifd
14ec0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
14ed0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
14ee0 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 30  RS.  if( (rc & 0
14ef0 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  xff) == SQLITE_I
14f00 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
14f10 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
14f20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14f30 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
14f40 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
14f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
14f60 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
14f70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
14f80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14f90 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
14fa0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
14fb0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
14fc0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
14fd0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
14fe0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14ff0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
15000 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
15010 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
15020 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
15030 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
15040 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
15050 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
15060 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
15070 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
15080 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
15090 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
150a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
150b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
150c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
150d0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
150e0 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
150f0 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b  %d pid=%d (flock
15100 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
15110 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
15120 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
15130 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
15140 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
15150 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
15160 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
15170 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
15180 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
15190 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
151a0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
151b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
151c0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
151d0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
151e0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
151f0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
15200 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
15210 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
15220 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
15230 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15240 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
15250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15260 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
15270 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
15280 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f  ock. */.  if( ro
15290 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
152a0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b  ->h, LOCK_UN) ){
152b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
152c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
152d0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75  _ERRORS.    retu
152e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
152f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
15300 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
15310 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72  _ERRORS */.    r
15320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
15330 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  RR_UNLOCK;.  }el
15340 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  se{.    pFile->e
15350 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
15360 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
15370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
15380 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
15390 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
153a0 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
153b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
153c0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  {.  assert( id!=
153d0 30 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  0 );.  flockUnlo
153e0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
153f0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
15400 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
15410 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15420 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15430 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
15440 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
15450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
15460 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
15470 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
15480 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
15490 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
154a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15550 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
15560 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
15570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15580 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
15590 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
155a0 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
155b0 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
155c0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
155d0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
155e0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
155f0 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
15600 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
15610 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
15620 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
15630 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
15640 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
15650 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
15660 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
15670 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
15680 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
15690 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
156a0 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
156b0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
156c0 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
156d0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
156e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
156f0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
15700 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
15710 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
15720 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
15730 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
15740 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
15750 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
15760 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
15770 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
15780 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
15790 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
157a0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
157b0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
157c0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
157d0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
157e0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
157f0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
15800 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
15810 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68  tatic int semXCh
15820 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
15830 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15840 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
15850 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15860 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
15870 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
15880 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15890 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
158a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
158b0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
158c0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
158d0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
158e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
158f0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
15900 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15910 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15920 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15930 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
15940 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
15950 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
15960 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
15970 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
15980 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
15990 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
159a0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
159b0 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f  rved ){.    sem_
159c0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
159d0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
159e0 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
159f0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
15a00 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
15a10 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
15a20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
15a30 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
15a40 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
15a50 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
15a60 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
15a70 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
15a80 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
15a90 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
15aa0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
15ab0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
15ac0 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
15ad0 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
15ae0 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
15af0 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
15b00 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
15b10 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
15b20 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck < SHARED_LOCK
15b30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77  else{.      /* w
15b50 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
15b60 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
15b70 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28  .      sem_post(
15b80 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSem);.    }.  }
15b90 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
15ba0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
15bb0 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
15bc0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
15bd0 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
15be0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
15bf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15c00 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
15c10 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
15c20 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
15c30 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
15c40 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
15c50 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
15c60 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
15c70 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
15c80 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
15c90 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
15ca0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
15cb0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
15cc0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
15cd0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
15ce0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
15cf0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
15d00 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
15d10 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
15d20 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
15d30 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
15d40 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
15d50 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
15d60 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
15d70 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
15d80 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
15d90 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
15da0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
15db0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
15dc0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
15dd0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
15de0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
15df0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
15e00 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
15e10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
15e20 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
15e30 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
15e40 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
15e50 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
15e60 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
15e70 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
15e80 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15e90 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
15ea0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
15eb0 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
15ec0 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
15ed0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
15ee0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
15ef0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
15f00 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
15f10 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
15f20 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
15f30 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
15f40 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
15f50 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
15f60 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
15f70 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
15f80 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
15f90 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
15fa0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
15fb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
15fc0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
15fd0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
15fe0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
15ff0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
16000 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
16010 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
16020 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69  nt semXLock(sqli
16030 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16040 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
16050 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16060 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16070 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
16080 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
16090 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
160a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
160b0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
160c0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
160d0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
160e0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
160f0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
16100 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
16110 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
16120 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
16130 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
16140 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
16150 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
16160 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
16170 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
16180 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
16190 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
161a0 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
161b0 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
161c0 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
161d0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
161e0 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
161f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16200 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
16210 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
16220 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
16230 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
16240 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
16250 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16260 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
16270 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
16280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
16290 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
162a0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
162b0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
162c0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
162d0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
162e0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
162f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
16300 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
16310 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
16320 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16330 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
16340 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
16350 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
16360 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
16370 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
16390 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  mXUnlock(sqlite3
163a0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
163b0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
163c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
163d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
163e0 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
163f0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
16400 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  em;..  assert( p
16410 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
16420 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52  ( pSem );.  OSTR
16430 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
16440 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
16450 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
16460 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
16470 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16480 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73  e->eFileLock, os
16490 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61  Getpid(0)));.  a
164a0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
164b0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
164c0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
164d0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
164e0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
164f0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
16500 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16510 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
16520 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
16530 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
16540 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
16550 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
16560 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
16570 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
16580 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
16590 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
165a0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
165b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
165c0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
165d0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
165e0 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
165f0 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
16600 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
16610 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
16620 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
16630 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
16640 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
16650 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
16660 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
16670 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
16680 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
16690 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
166a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
166b0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
166c0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
166d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
166e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
166f0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
16700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
16710 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  XClose(sqlite3_f
16720 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
16730 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
16740 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
16750 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
16760 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  semXUnlock(id, N
16770 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73  O_LOCK);.    ass
16780 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16790 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69    assert( unixFi
167a0 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70  leMutexNotheld(p
167b0 46 69 6c 65 29 20 29 3b 0a 20 20 20 20 75 6e 69  File) );.    uni
167c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
167d0 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
167e0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
167f0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
16800 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46  ;.    closeUnixF
16810 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72  ile(id);.  }.  r
16820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16830 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  .}..#endif /* OS
16840 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a  _VXWORKS */./*.*
16850 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
16860 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
16870 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56  y available on V
16880 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  xWorks..**.*****
16890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
168a0 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  f the named sema
168b0 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  phore lock imple
168c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
168d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
168e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
16930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
16980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16990 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41  ******** Begin A
169a0 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FP Locking *****
169b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
169c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
169d0 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70  ** AFP is the Ap
169e0 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f  ple Filing Proto
169f0 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e  col.  AFP is a n
16a00 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65  etwork filesyste
16a10 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70  m found.** on Ap
16a20 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f  ple Macintosh co
16a30 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f  mputers - both O
16a40 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a  S9 and OSX..**.*
16a50 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d  * Third-party im
16a60 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
16a70 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62   AFP are availab
16a80 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f  le.  But this co
16a90 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20  de here.** only 
16aa0 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f  works on OSX..*/
16ab0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
16ac0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
16ad0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
16ae0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68  G_STYLE./*.** Th
16af0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
16b00 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ext structure co
16b10 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c  ntains all afp l
16b20 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61  ock specific sta
16b30 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  te.*/.typedef st
16b40 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
16b50 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
16b60 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
16b70 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
16b80 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72  xt {.  int reser
16b90 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ved;.  const cha
16ba0 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
16bb0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
16bc0 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
16bd0 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79  */.};..struct By
16be0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b  teRangeLockPB2.{
16bf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
16c00 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20   long offset;   
16c10 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74       /* offset t
16c20 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
16c30 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
16c40 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
16c50 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  gth;        /* n
16c60 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  br of bytes to l
16c70 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
16c80 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52  d long long retR
16c90 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62  angeStart; /* nb
16ca0 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f  r of 1st byte lo
16cb0 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66  cked if successf
16cc0 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ul */.  unsigned
16cd0 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67   char unLockFlag
16ce0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d  ;         /* 1 =
16cf0 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63   unlock, 0 = loc
16d00 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
16d10 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61  char startEndFla
16d20 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65  g;       /* 1=re
16d30 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b  l to end of fork
16d40 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74  , 0=rel to start
16d50 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d70 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20          /* file 
16d80 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68  desc to assoc th
16d90 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a  is lock with */.
16da0 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66  };..#define afpf
16db0 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
16dc0 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57  SCTL        _IOW
16dd0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
16de0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
16df0 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  B2)../*.** This 
16e00 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72  is a utility for
16e10 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61   setting or clea
16e20 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65  ring a bit-range
16e30 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41   lock on an.** A
16e40 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a  FP filesystem..*
16e50 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  * .** Return SQL
16e60 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
16e70 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  s, SQLITE_BUSY o
16e80 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
16e90 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c  atic int afpSetL
16ea0 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock(.  const cha
16eb0 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
16ec0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16ed0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
16ee0 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b  locked or unlock
16ef0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ed */.  unixFile
16f00 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
16f10 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
16f20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
16f30 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69  n path */.  unsi
16f40 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
16f50 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69  ffset,     /* Fi
16f60 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
16f70 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  ocked */.  unsig
16f80 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
16f90 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ngth,     /* Num
16fa0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
16fb0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65  lock */.  int se
16fc0 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20  tLockFlag       
16fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16fe0 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46   to set lock.  F
16ff0 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f  alse to clear lo
17000 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
17010 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
17020 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72  B2 pb;.  int err
17030 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
17040 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
17050 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
17060 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
17070 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
17080 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
17090 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
170a0 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d    pb.fd = pFile-
170b0 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45  >h;.  .  OSTRACE
170c0 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25  (("AFPSETLOCK [%
170d0 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72  s] for %d%s in r
170e0 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e  ange %llx:%llx\n
170f0 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b  ", .    (setLock
17100 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29  Flag?"ON":"OFF")
17110 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e  , pFile->h, (pb.
17120 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c  fd==-1?"[testval
17130 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66  -1]":""),.    of
17140 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a  fset, length));.
17150 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
17160 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
17170 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
17180 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
17190 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  r==-1 ) {.    in
171a0 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45  t rc;.    int tE
171b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
171c0 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
171d0 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f  ETLOCK failed to
171e0 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64   fsctl() '%s' %d
171f0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
17200 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e       path, tErrn
17210 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72  o, strerror(tErr
17220 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51  no)));.#ifdef SQ
17230 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f  LITE_IGNORE_AFP_
17240 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
17250 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17260 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
17270 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
17280 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
17290 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
172a0 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c         setLockFl
172b0 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  ag ? SQLITE_IOER
172c0 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f  R_LOCK : SQLITE_
172d0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
172e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
172f0 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
17300 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66  ERRORS */.    if
17310 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17320 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  rc) ){.      sto
17330 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
17340 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
17350 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
17360 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
17370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17380 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
17390 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
173a0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
173b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
173c0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
173d0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
173e0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
173f0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
17400 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
17410 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
17420 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
17430 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
17440 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
17450 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
17460 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
17470 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
17480 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
17490 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
174a0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
174b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
174c0 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76  t afpCheckReserv
174d0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
174e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
174f0 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
17500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17510 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
17520 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
17530 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
17540 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  )id;.  afpLockin
17550 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
17560 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  t;.  .  Simulate
17570 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
17580 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
17590 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
175a0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
175b0 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65  pFile );.  conte
175c0 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
175d0 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
175e0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
175f0 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d  ;.  if( context-
17600 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  >reserved ){.   
17610 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20   *pResOut = 1;. 
17620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17630 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
17640 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
17650 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c  File->pInode->pL
17660 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 2f 2a 20  ockMutex);.  /* 
17670 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
17680 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
17690 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
176a0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
176b0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
176c0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
176d0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
176e0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
176f0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
17700 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
17710 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
17720 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
17730 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
17740 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
17750 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
17760 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
17770 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17780 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
17790 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
177a0 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
177b0 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
177c0 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
177d0 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
177e0 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
177f0 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
17800 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
17810 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
17820 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
17830 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17840 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17850 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
17860 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
17870 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
17880 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
17890 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
178a0 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
178b0 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
178c0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
178d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
178e0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
178f0 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
17900 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
17910 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .  .  sqlite3_mu
17920 74 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d  tex_leave(pFile-
17930 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  >pInode->pLockMu
17940 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
17950 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
17960 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
17970 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
17980 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
17990 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
179a0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
179b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
179c0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
179d0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
179e0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
179f0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
17a00 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
17a10 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
17a20 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
17a30 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
17a40 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
17a50 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
17a60 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
17a70 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
17a80 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
17a90 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
17aa0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
17ab0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
17ac0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
17ad0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
17ae0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
17af0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
17b00 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
17b10 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
17b20 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
17b30 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
17b40 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
17b50 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
17b60 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
17b70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
17b80 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
17b90 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
17ba0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
17bb0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
17bc0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
17bd0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
17be0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
17bf0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
17c00 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
17c10 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
17c20 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
17c30 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
17c40 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17c50 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
17c60 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
17c70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
17c80 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
17c90 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
17ca0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
17cb0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
17cc0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
17cd0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
17ce0 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
17cf0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17d00 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
17d10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17d20 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
17d30 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17d40 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
17d50 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
17d60 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
17d70 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
17d80 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
17d90 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
17da0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
17db0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
17dc0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
17dd0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
17de0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
17df0 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
17e00 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
17e10 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
17e20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
17e30 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
17e40 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
17e50 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
17e60 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
17e70 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
17e80 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
17e90 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
17ea0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
17eb0 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
17ec0 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
17ed0 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
17ee0 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
17ef0 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
17f00 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
17f10 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
17f20 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
17f30 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
17f40 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
17f50 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
17f60 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
17f70 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
17f80 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
17f90 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
17fa0 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
17fb0 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70  eld) (afp)\n", p
17fc0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
17fd0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
17fe0 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
17ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18000 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
18010 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
18020 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
18030 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29  orrect.  **  (1)
18040 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
18050 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
18060 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
18070 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
18080 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
18090 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
180a0 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
180b0 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
180c0 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
180d0 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
180e0 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
180f0 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
18100 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
18110 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
18120 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
18130 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
18140 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
18150 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
18160 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
18170 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
18180 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
18190 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
181a0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
181b0 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
181c0 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
181d0 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
181e0 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
181f0 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
18200 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f 64 65  ds.  */.  pInode
18210 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
18220 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18230 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e  x_enter(pInode->
18240 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20  pLockMutex);..  
18250 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
18260 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
18270 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
18280 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
18290 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
182a0 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
182b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
182c0 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
182d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
182e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
182f0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
18300 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
18310 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
18320 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
18330 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
18340 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
18350 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18360 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
18370 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
18380 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
18390 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
183a0 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
183b0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
183c0 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
183d0 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
183e0 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
183f0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
18400 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
18410 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
18420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
18430 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
18440 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
18450 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
18460 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
18470 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
18480 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
18490 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
184a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
184b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
184c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
184d0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
184e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
184f0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
18500 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
18510 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18520 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
18530 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
18540 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
18550 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
18560 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
18570 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
18580 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
18590 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
185a0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
185b0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
185c0 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
185d0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
185e0 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
185f0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
18600 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
18610 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
18620 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
18630 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
18640 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
18650 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
18660 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
18670 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
18680 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
18690 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
186a0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
186b0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
186c0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
186d0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
186e0 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
186f0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
18700 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
18710 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
18720 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
18730 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
18740 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
18750 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
18760 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
18770 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
18780 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
18790 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
187a0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
187b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
187c0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
187d0 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
187e0 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
187f0 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
18800 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
18810 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18820 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
18830 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
18840 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
18850 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
18860 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
18870 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
18880 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
18890 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
188a0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
188b0 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
188c0 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
188d0 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
188e0 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
188f0 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
18900 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
18910 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
18920 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18930 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
18940 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
18950 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
18960 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18970 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18980 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
18990 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
189a0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
189b0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
189c0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
189d0 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
189e0 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
189f0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
18a00 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
18a10 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
18a20 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
18a30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18a40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18a50 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
18a60 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
18a70 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
18a80 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
18a90 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
18aa0 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72  no(pFile, lrc1Er
18ab0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rno);.      rc =
18ac0 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
18ad0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
18ae0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
18af0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
18b00 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
18b10 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
18b20 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
18b30 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
18b40 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
18b50 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
18b60 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
18b70 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
18b80 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
18b90 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
18ba0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
18bb0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
18bc0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
18bd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
18be0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
18bf0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
18c00 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
18c10 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
18c20 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
18c30 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
18c40 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
18c50 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
18c60 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
18c70 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
18c80 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
18c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
18ca0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
18cb0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
18cc0 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
18cd0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
18ce0 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
18cf0 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
18d00 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
18d10 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
18d20 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
18d30 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
18d40 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
18d50 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
18d60 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
18d70 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
18d80 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
18d90 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
18da0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
18db0 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
18dc0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
18dd0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
18de0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
18df0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
18e00 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18e10 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18e20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
18e30 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
18e40 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
18e50 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
18e60 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
18e70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
18e80 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
18e90 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
18ea0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
18eb0 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
18ec0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
18ed0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
18ee0 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
18ef0 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
18f00 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
18f10 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
18f20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
18f30 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
18f40 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
18f50 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
18f60 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
18f70 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
18f80 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18f90 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18fa0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
18fb0 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
18fd0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18fe0 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
18ff0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
19000 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
19010 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
19020 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
19030 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
19040 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
19050 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
19060 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
19070 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
19080 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
190b0 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
190c0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
190d0 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
190e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
190f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
19120 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
19130 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
19140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
19150 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
19160 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
19170 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
19180 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
19190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
191a0 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
191b0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
191c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
191d0 66 61 69 6c 65 64 20 26 20 30 78 66 66 29 20 3d  failed & 0xff) =
191e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
191f0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
19200 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
19210 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
19220 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
19230 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
19240 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
19250 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
19260 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
19270 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
19280 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
19290 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
192a0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
192b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
192c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
192d0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
192e0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
192f0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
19300 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
19310 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
19320 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
19330 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
19340 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
19350 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
19360 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
19370 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
19380 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
19390 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
193a0 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  eave(pInode->pLo
193b0 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ckMutex);.  OSTR
193c0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
193d0 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c   %s %s (afp)\n",
193e0 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
193f0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
19400 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
19410 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
19420 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
19430 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19440 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
19450 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
19460 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19470 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
19480 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
19490 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
194a0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
194b0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
194c0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
194d0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
194e0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
194f0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
19500 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
19510 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
19520 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
19530 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
19540 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f  atic int afpUnlo
19550 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
19560 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
19570 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
19580 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
19590 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
195a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
195b0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
195c0 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
195d0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
195e0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
195f0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
19600 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
19610 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68  xt;.  int skipSh
19620 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66  ared = 0;.#ifdef
19630 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
19640 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  nt h = pFile->h;
19650 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
19660 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
19670 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
19680 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
19690 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
196a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
196b0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
196c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
196d0 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
196e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
196f0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
19700 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20  nShared,.       
19710 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
19720 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
19730 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
19740 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
19750 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
19760 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
19770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19780 4b 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 20  K;.  }.  pInode 
19790 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
197a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
197b0 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70  _enter(pInode->p
197c0 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 61 73  LockMutex);.  as
197d0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
197e0 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
197f0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
19800 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
19810 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
19820 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
19830 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
19840 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
19850 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
19860 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19870 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
19880 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19890 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
198a0 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
198b0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
198c0 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
198d0 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
198e0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
198f0 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
19900 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
19910 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
19920 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
19930 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
19940 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
19950 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
19960 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
19970 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
19980 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
19990 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
199a0 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
199b0 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
199c0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
199d0 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
199e0 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
199f0 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
19a00 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
19a10 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
19a20 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
19a30 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
19a40 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
19a50 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
19a60 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
19a70 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
19a80 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
19a90 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
19aa0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
19ab0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
19ac0 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
19ad0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
19ae0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
19af0 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
19b00 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
19b10 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
19b20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
19b30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
19b40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
19b50 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
19b60 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19b70 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
19b80 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
19b90 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
19ba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19bb0 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
19bc0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
19bd0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
19be0 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
19bf0 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
19c00 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
19c10 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
19c20 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
19c30 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
19c40 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
19c50 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
19c60 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
19c70 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19c80 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19c90 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
19ca0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
19cb0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
19cc0 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
19cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19cf0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
19d00 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
19d10 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
19d20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
19d30 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
19d40 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
19d50 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
19d60 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
19d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
19d80 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
19d90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
19da0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
19db0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
19dc0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19dd0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19de0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
19df0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
19e00 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
19e10 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
19e20 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
19e30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
19e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19e50 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
19e60 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
19e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
19e80 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
19e90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
19ea0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
19eb0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
19ec0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
19ed0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
19ee0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
19ef0 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
19f00 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
19f10 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
19f20 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
19f30 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
19f40 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
19f50 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
19f60 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
19f70 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
19f80 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
19f90 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
19fa0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
19fb0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
19fc0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
19fd0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
19fe0 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
19ff0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
1a000 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
1a010 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a020 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
1a030 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
1a040 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
1a050 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a060 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
1a070 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
1a080 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
1a090 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1a0a0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
1a0b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
1a0c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1a0d0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
1a0e0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
1a0f0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
1a100 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
1a110 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
1a120 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
1a130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1a140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a150 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
1a160 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
1a170 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
1a180 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
1a190 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
1a1a0 30 20 29 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  0 ) closePending
1a1b0 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
1a1c0 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74  }.  }.  .  sqlit
1a1d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1a1e0 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
1a1f0 78 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  x);.  if( rc==SQ
1a200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1a210 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1a220 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
1a230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a240 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
1a250 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
1a260 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
1a270 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
1a280 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
1a290 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
1a2a0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
1a2b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1a2c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1a2d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1a2e0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
1a2f0 29 3b 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69  );.  afpUnlock(i
1a300 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 61  d, NO_LOCK);.  a
1a310 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d  ssert( unixFileM
1a320 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c  utexNotheld(pFil
1a330 65 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  e) );.  unixEnte
1a340 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  rMutex();.  if( 
1a350 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 29 7b  pFile->pInode ){
1a360 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
1a370 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
1a380 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  le->pInode;.    
1a390 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a3a0 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
1a3b0 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28  kMutex);.    if(
1a3c0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29   pInode->nLock )
1a3d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1a3e0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
1a3f0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
1a400 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
1a410 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
1a420 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
1a430 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
1a440 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
1a450 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
1a460 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1a470 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
1a480 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
1a490 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
1a4a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
1a4b0 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
1a4c0 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
1a4d0 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
1a4e0 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
1a4f0 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
1a500 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a510 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e  _mutex_leave(pIn
1a520 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
1a530 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49  ;.  }.  releaseI
1a540 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
1a550 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1a560 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
1a570 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d 20 63  ntext);.  rc = c
1a580 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
1a590 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
1a5a0 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
1a5b0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
1a5c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1a5d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1a5e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1a5f0 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
1a600 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
1a610 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
1a620 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
1a630 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
1a640 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
1a650 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
1a660 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
1a670 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
1a680 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
1a690 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
1a6a0 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
1a6b0 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
1a6c0 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
1a6d0 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
1a6e0 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
1a6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1a700 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
1a710 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1a720 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
1a730 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1a740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a780 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
1a790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1a7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7f0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
1a800 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
1a810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
1a830 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1a840 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1a850 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1a860 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
1a870 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1a880 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
1a890 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
1a8a0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
1a8b0 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
1a8c0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
1a8d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
1a8e0 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
1a8f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
1a900 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1a910 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
1a920 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
1a930 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
1a940 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
1a950 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1a960 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
1a970 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
1a980 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1a990 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
1a9a0 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
1a9b0 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
1a9c0 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
1a9d0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1a9e0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1a9f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1aa00 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1aa10 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1aa20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
1aa30 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1aa40 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1aa50 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1aa60 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1aa70 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1aa80 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1aa90 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1aaa0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
1aab0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1aac0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
1aad0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
1aae0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
1aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab00 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1ab50 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aba0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1abb0 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
1abc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
1abd0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abf0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
1ac00 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
1ac10 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
1ac20 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
1ac30 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
1ac40 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
1ac50 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
1ac60 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1ac70 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
1ac80 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
1ac90 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
1aca0 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
1acb0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
1acc0 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
1acd0 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
1ace0 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
1acf0 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
1ad00 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
1ad10 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
1ad20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
1ad30 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
1ad40 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
1ad50 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1ad60 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
1ad70 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
1ad80 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
1ad90 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1ada0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1adb0 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
1adc0 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
1add0 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
1ade0 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
1adf0 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
1ae00 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1ae10 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
1ae20 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
1ae30 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
1ae40 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
1ae50 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
1ae60 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
1ae70 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
1ae80 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66  READ.** in any f
1ae90 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
1aea0 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
1aeb0 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
1aec0 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
1aed0 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
1aee0 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
1aef0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1af00 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1af10 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1af20 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
1af30 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1af40 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1af50 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1af60 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
1af70 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
1af80 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
1af90 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
1afa0 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
1afb0 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
1afc0 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
1afd0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
1afe0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
1aff0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
1b000 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
1b010 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1b020 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
1b030 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
1b040 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
1b050 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  2 );.  do{.#if d
1b060 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1b070 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72  ).    got = osPr
1b080 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
1b090 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
1b0a0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1b0b0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
1b0c0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1b0d0 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67  E_PREAD64).    g
1b0e0 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
1b0f0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1b100 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
1b110 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
1b120 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
1b130 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
1b140 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
1b150 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
1b160 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1b170 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 20  rror( newOffset 
1b180 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  = -1 );.    if( 
1b190 6e 65 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a 20  newOffset<0 ){. 
1b1a0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1b1b0 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1b1c0 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  d, errno);.     
1b1d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1b1e0 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65  }.    got = osRe
1b1f0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
1b200 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  cnt);.#endif.   
1b210 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20   if( got==cnt ) 
1b220 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67  break;.    if( g
1b230 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ot<0 ){.      if
1b240 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  ( errno==EINTR )
1b250 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69  { got = 1; conti
1b260 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69  nue; }.      pri
1b270 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  or = 0;.      st
1b280 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1b290 69 78 46 69 6c 65 2a 29 69 64 2c 20 20 65 72 72  ixFile*)id,  err
1b2a0 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  no);.      break
1b2b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b2c0 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63  got>0 ){.      c
1b2d0 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20  nt -= got;.     
1b2e0 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a   offset += got;.
1b2f0 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67        prior += g
1b300 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  ot;.      pBuf =
1b310 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28   (void*)(got + (
1b320 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20  char*)pBuf);.   
1b330 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74   }.  }while( got
1b340 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e  >0 );.  TIMER_EN
1b350 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  D;.  OSTRACE(("R
1b360 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
1b370 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20  %7lld %llu\n",. 
1b380 20 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68             id->h
1b390 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66  , got+prior, off
1b3a0 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52  set-prior, TIMER
1b3b0 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
1b3c0 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a  turn got+prior;.
1b3d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
1b3e0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
1b3f0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
1b400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1b410 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
1b420 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
1b430 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
1b440 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
1b450 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1b460 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1b470 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
1b480 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
1b490 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
1b4a0 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
1b4b0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
1b4c0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1b4d0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1b4e0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
1b4f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
1b500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
1b510 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  set>=0 );.  asse
1b520 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
1b530 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1b540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
1b550 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
1b560 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
1b570 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
1b580 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
1b590 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
1b5a0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
1b5b0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1b5c0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
1b5d0 72 74 28 20 70 46 69 6c 65 2d 3e 70 50 72 65 61  rt( pFile->pPrea
1b5e0 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 3d 3d  llocatedUnused==
1b5f0 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
1b600 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1b610 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1b620 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1b630 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1b640 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1b650 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1b660 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1b670 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1b680 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
1b690 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1b6a0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1b6b0 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1b6c0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1b6d0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1b6e0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1b6f0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1b700 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1b710 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1b720 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1b730 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
1b740 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1b750 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1b760 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1b770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b790 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1b7a0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1b7b0 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1b7c0 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1b7d0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b7e0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
1b7f0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1b800 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1b810 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1b820 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1b830 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1b840 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1b850 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
1b860 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1b870 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1b880 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
1b890 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
1b8a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b8b0 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
1b8c0 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
1b8d0 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1b8e0 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
1b8f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b900 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1b910 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1b920 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20  no(pFile, 0);   
1b930 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1b940 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
1b950 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
1b960 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
1b970 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
1b980 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
1b990 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
1b9a0 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
1b9b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b9c0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1b9d0 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
1b9e0 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20  Attempt to seek 
1b9f0 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70  the file-descrip
1ba00 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
1ba10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1ba20 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20   to.** absolute 
1ba30 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65  offset iOff, the
1ba40 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  n attempt to wri
1ba50 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
1ba60 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42   data from.** pB
1ba70 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20  uf to it. If an 
1ba80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
1ba90 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20  turn -1 and set 
1baa0 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77  *piErrno. Otherw
1bab0 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ise, .** return 
1bac0 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65  the actual numbe
1bad0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1bae0 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  en (which may be
1baf0 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42   less than.** nB
1bb00 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uf)..*/.static i
1bb10 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  nt seekAndWriteF
1bb20 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  d(.  int fd,    
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
1bb50 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65  criptor to write
1bb60 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66   to */.  i64 iOf
1bb70 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1bb80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1bb90 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
1bba0 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20   writing at */. 
1bbb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1bbc0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1bbd0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1bbe0 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20 74  om this buffer t
1bbf0 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
1bc00 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1bc30 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73 20  r pBuf in bytes 
1bc40 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e  */.  int *piErrn
1bc50 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
1bc60 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
1bc70 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72  or number if err
1bc80 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a  or occurs */.){.
1bc90 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1bcc0 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63 61  ned by system ca
1bcd0 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
1bce0 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31   nBuf==(nBuf&0x1
1bcf0 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
1bd00 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61 73 73  t( fd>2 );.  ass
1bd10 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d 30 20  ert( piErrno!=0 
1bd20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31  );.  nBuf &= 0x1
1bd30 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54  ffff;.  TIMER_ST
1bd40 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  ART;..#if define
1bd50 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
1bd60 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
1bd70 77 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  write(fd, pBuf, 
1bd80 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68  nBuf, iOff); }wh
1bd90 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1bda0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
1bdb0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1bdc0 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63  READ64).  do{ rc
1bdd0 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
1bde0 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  64(fd, pBuf, nBu
1bdf0 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28  f, iOff);}while(
1be00 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1be10 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20  EINTR);.#else.  
1be20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65  do{.    i64 iSee
1be30 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f  k = lseek(fd, iO
1be40 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  ff, SEEK_SET);. 
1be50 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1be60 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31 20 29  or( iSeek = -1 )
1be70 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 3c  ;.    if( iSeek<
1be80 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1be90 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
1bea0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1beb0 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75 66  osWrite(fd, pBuf
1bec0 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c  , nBuf);.  }whil
1bed0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1bee0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
1bef0 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  f..  TIMER_END;.
1bf00 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
1bf10 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
1bf20 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20  ld %llu\n", fd, 
1bf30 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f  rc, iOff, TIMER_
1bf40 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66  ELAPSED));..  if
1bf50 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72 72 6e  ( rc<0 ) *piErrn
1bf60 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74  o = errno;.  ret
1bf70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1bf80 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
1bf90 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
1bfa0 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
1bfb0 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
1bfc0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1bfd0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1bfe0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
1bff0 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
1c000 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  t..**.** To avoi
1c010 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
1c020 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
1c030 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65  failed write the
1c040 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
1c050 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
1c060 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1c070 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
1c080 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
1c090 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
1c0a0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
1c0b0 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
1c0c0 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72  return seekAndWr
1c0d0 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66  iteFd(id->h, off
1c0e0 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  set, pBuf, cnt, 
1c0f0 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b  &id->lastErrno);
1c100 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
1c110 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1c120 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
1c130 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1c140 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
1c150 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
1c160 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
1c170 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
1c180 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
1c190 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1c1a0 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
1c1b0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
1c1c0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
1c1d0 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
1c1e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1c1f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1c200 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
1c210 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
1c220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1c230 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1c240 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1c250 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1c260 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1c270 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1c280 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1c290 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1c2a0 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1c2b0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1c2c0 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1c2d0 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1c2e0 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
1c2f0 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  dUnused==0.     
1c300 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1c310 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1c320 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1c330 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1c340 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1c350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c360 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  UG.  /* If we ar
1c370 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1c380 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1c390 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1c3a0 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f  posed to.  ** do
1c3b0 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1c3c0 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1c3d0 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1c3e0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1c3f0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1c400 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20  base file) then 
1c410 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
1c420 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1c430 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67  e.  ** has chang
1c440 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
1c450 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1c460 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63  is modified, rec
1c470 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61  ord that.  ** fa
1c480 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ct too..  */.  i
1c490 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1c4a0 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70  alWrite ){.    p
1c4b0 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
1c4c0 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
1c4d0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
1c4e0 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
1c4f0 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
1c500 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
1c510 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1c520 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
1c530 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
1c540 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1c550 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1c560 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1c570 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
1c580 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
1c590 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1c5a0 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1c5b0 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
1c5c0 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
1c5d0 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
1c5e0 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
1c5f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1c600 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
1c610 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1c620 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
1c630 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
1c640 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1c650 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1c660 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
1c670 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54 45  WRITE) && SQLITE
1c680 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1c690 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1c6a0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1c6b0 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
1c6c0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
1c6d0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
1c6e0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
1c6f0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
1c700 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
1c710 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
1c720 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1c730 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
1c740 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
1c750 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
1c760 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1c770 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1c780 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1c790 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
1c7a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c7b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c7c0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
1c7d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
1c7e0 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
1c7f0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1c800 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1c810 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
1c820 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
1c830 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
1c840 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
1c850 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
1c860 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
1c870 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
1c880 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65 28  endif. .  while(
1c890 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
1c8a0 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
1c8b0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1c8c0 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e 30  )<amt && wrote>0
1c8d0 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
1c8e0 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
1c8f0 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
1c900 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
1c910 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
1c920 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1c930 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
1c940 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
1c950 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1c960 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
1c970 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
1c980 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20  mt>wrote ){.    
1c990 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
1c9a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
1c9b0 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
1c9c0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1c9d0 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
1c9e0 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1c9f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1ca00 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1ca10 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
1ca20 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1ca30 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1ca40 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
1ca50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1ca60 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
1ca70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ca80 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1ca90 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
1caa0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1cab0 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
1cac0 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
1cad0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1cae0 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
1caf0 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
1cb00 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61   are occurring a
1cb10 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
1cb20 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1cb30 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
1cb40 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
1cb50 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
1cb60 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1cb70 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20  We do not trust 
1cb80 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69  systems to provi
1cb90 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61  de a working fda
1cba0 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20  tasync().  Some 
1cbb0 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f  do..** Others do
1cbc0 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65   no.  To be safe
1cbd0 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20  , we will stick 
1cbe0 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74  with the (slight
1cbf0 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73  ly slower).** fs
1cc00 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e  ync(). If you kn
1cc10 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73  ow that your sys
1cc20 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74  tem does support
1cc30 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72   fdatasync() cor
1cc40 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20  rectly,.** then 
1cc50 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77  simply compile w
1cc60 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d  ith -Dfdatasync=
1cc70 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48  fdatasync or -DH
1cc80 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f  AVE_FDATASYNC.*/
1cc90 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
1cca0 61 74 61 73 79 6e 63 29 20 26 26 20 21 48 41 56  atasync) && !HAV
1ccb0 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
1ccc0 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1ccd0 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1cce0 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1ccf0 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1cd00 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1cd10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1cd20 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1cd30 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1cd40 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1cd50 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1cd60 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1cd70 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1cd80 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1cd90 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1cda0 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1cdb0 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1cdc0 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1cdd0 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1cde0 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
1cdf0 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1ce00 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1ce10 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1ce20 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1ce30 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1ce40 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1ce50 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1ce60 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1ce70 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1ce80 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1ce90 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1cea0 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1ceb0 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1cec0 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1ced0 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1cee0 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1cef0 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1cf00 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1cf10 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1cf20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1cf30 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1cf40 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1cf50 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1cf60 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1cf70 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1cf80 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1cf90 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1cfa0 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1cfb0 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1cfc0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1cfd0 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1cfe0 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1cff0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1d000 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1d010 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1d020 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1d030 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1d040 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1d050 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1d060 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1d070 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1d080 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1d090 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1d0a0 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1d0b0 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1d0c0 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1d0d0 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1d0e0 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1d0f0 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1d100 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1d110 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1d120 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1d130 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1d140 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1d150 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1d160 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1d170 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1d180 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1d190 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1d1a0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1d1b0 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1d1c0 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1d1d0 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1d1e0 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1d1f0 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1d200 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1d210 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1d220 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1d230 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1d240 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1d250 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1d260 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1d270 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1d280 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1d290 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1d2a0 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1d2b0 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1d2c0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1d2d0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1d2e0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1d2f0 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1d300 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1d310 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1d320 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1d330 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1d340 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d350 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1d360 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1d370 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1d380 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1d390 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1d3a0 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1d3b0 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1d3c0 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1d3d0 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1d3e0 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1d3f0 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1d400 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1d410 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1d420 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d430 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1d440 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1d450 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1d460 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1d470 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1d480 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1d490 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1d4a0 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1d4b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1d4c0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1d4d0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1d4e0 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1d4f0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1d500 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1d510 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1d520 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1d530 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1d540 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1d550 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1d560 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1d570 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1d580 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1d590 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1d5a0 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1d5b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1d5c0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1d5d0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1d5e0 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1d5f0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1d600 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1d610 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1d620 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1d630 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1d640 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1d650 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 67  ** no-op.  But g
1d660 6f 20 61 68 65 61 64 20 61 6e 64 20 63 61 6c 6c  o ahead and call
1d670 20 66 73 74 61 74 28 29 20 74 6f 20 76 61 6c 69   fstat() to vali
1d680 64 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  date the file.  
1d690 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 73  ** descriptor as
1d6a0 20 77 65 20 6e 65 65 64 20 61 20 6d 65 74 68 6f   we need a metho
1d6b0 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61 20 66  d to provoke a f
1d6c0 61 69 6c 75 72 65 20 64 75 72 69 6e 67 0a 20 20  ailure during.  
1d6d0 2a 2a 20 63 6f 76 65 72 61 74 65 20 74 65 73 74  ** coverate test
1d6e0 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ing..  */.#ifdef
1d6f0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1d700 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73    {.    struct s
1d710 74 61 74 20 62 75 66 3b 0a 20 20 20 20 72 63 20  tat buf;.    rc 
1d720 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 62  = osFstat(fd, &b
1d730 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 48  uf);.  }.#elif H
1d740 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1d750 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
1d760 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1d770 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1d780 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1d790 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1d7a0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1d7b0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1d7c0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1d7d0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1d7e0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1d7f0 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1d800 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1d810 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1d820 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1d830 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1d840 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1d850 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1d860 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1d870 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1d880 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1d890 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1d8a0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1d8b0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1d8c0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1d8d0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1d8e0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1d8f0 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1d900 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1d910 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1d920 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1d930 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1d940 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1d950 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1d960 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1d970 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
1d980 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d990 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
1d9a0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
1d9b0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
1d9c0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
1d9d0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
1d9e0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
1d9f0 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
1da00 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
1da10 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
1da20 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
1da30 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
1da40 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
1da50 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
1da60 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
1da70 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
1da80 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
1da90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
1daa0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
1dab0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
1dac0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
1dad0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1dae0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
1daf0 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
1db00 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
1db10 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
1db20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1db30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1db40 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1db50 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1db60 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1db70 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1db80 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1db90 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1dba0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1dbb0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1dbc0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1dbd0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1dbe0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1dbf0 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1dc00 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1dc10 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1dc20 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1dc30 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1dc40 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1dc50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63  .**.** The direc
1dc60 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1dc70 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ptor is used for
1dc80 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20   only one thing 
1dc90 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20  - to.** fsync() 
1dca0 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d  a directory to m
1dcb0 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72  ake sure file cr
1dcc0 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74  eation and delet
1dcd0 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72  ion events.** ar
1dce0 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
1dcf0 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20  k.  Such fsyncs 
1dd00 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  are not needed o
1dd10 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e  n newer.** journ
1dd20 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d  aling filesystem
1dd30 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69  s, but are requi
1dd40 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c  red on older fil
1dd50 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20  esystems..**.** 
1dd60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1dd70 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75   be overridden u
1dd80 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73  sing the xSetSys
1dd90 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a  Call interface..
1dda0 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74  ** The ability t
1ddb0 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
1ddc0 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65  routine was adde
1ddd0 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20  d in support of 
1dde0 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20  the.** chromium 
1ddf0 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e  sandbox.  Openin
1de00 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73  g a directory is
1de10 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b   a security risk
1de20 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64   (we are.** told
1de30 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f  ) so making it o
1de40 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f  verrideable allo
1de50 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20  ws the chromium 
1de60 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65  sandbox to.** re
1de70 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69  place this routi
1de80 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65  ne with a harmle
1de90 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61  ss no-op.  To ma
1dea0 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1deb0 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c  ** a no-op, repl
1dec0 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74  ace it with a st
1ded0 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ub that returns 
1dee0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1def0 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74  aves.** *pFd set
1df00 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e   to a negative n
1df10 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  umber..**.** If 
1df20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1df30 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1df40 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1df50 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1df60 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1df70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1df80 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1df90 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1dfa0 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1dfb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1dfc0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1dfd0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1dfe0 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1dff0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1e000 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1e010 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1e020 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1e030 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1e040 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1e050 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1e060 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >0 && zDirname[i
1e070 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1e080 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1e090 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1e0a0 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a   '\0';.  }else{.
1e0b0 20 20 20 20 69 66 28 20 7a 44 69 72 6e 61 6d 65      if( zDirname
1e0c0 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44 69 72 6e  [0]!='/' ) zDirn
1e0d0 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20 20  ame[0] = '.';.  
1e0e0 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d 20 3d 20    zDirname[1] = 
1e0f0 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f  0;.  }.  fd = ro
1e100 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61  bust_open(zDirna
1e110 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
1e120 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66 28  INARY, 0);.  if(
1e130 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53   fd>=0 ){.    OS
1e140 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20  TRACE(("OPENDIR 
1e150 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1e160 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 7d 0a  zDirname));.  }.
1e170 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 69    *pFd = fd;.  i
1e180 66 28 20 66 64 3e 3d 30 20 29 20 72 65 74 75 72  f( fd>=0 ) retur
1e190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  n SQLITE_OK;.  r
1e1a0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1e1b0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1e1c0 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 44 69  EN_BKPT, "openDi
1e1d0 72 65 63 74 6f 72 79 22 2c 20 7a 44 69 72 6e 61  rectory", zDirna
1e1e0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  me);.}../*.** Ma
1e1f0 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1e200 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1e210 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1e220 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1e230 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1e240 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1e250 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1e260 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1e270 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1e280 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1e290 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1e2a0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1e2b0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1e2c0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1e2d0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1e2e0 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1e2f0 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1e300 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1e310 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1e320 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1e330 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1e340 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1e350 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1e360 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1e370 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1e380 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1e390 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1e3a0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1e3b0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1e3c0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1e3d0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1e3e0 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1e3f0 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1e400 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1e410 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1e420 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1e430 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1e440 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1e450 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1e460 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1e470 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1e480 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1e490 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1e4a0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1e4b0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1e4c0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1e4d0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1e4e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1e4f0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1e500 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1e510 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1e520 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1e530 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1e540 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1e550 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1e560 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1e570 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1e580 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1e590 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1e5a0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1e5b0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1e5c0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1e5d0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1e5e0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1e5f0 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1e600 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1e610 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1e620 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1e630 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1e640 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1e650 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1e660 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1e670 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1e680 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1e690 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1e6a0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1e6b0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1e6c0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1e6d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1e6e0 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1e6f0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1e700 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1e710 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1e720 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1e730 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1e740 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1e750 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1e760 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1e770 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1e780 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1e790 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1e7a0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1e7b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1e7c0 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c  OERR_FSYNC, "ful
1e7d0 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d  l_fsync", pFile-
1e7e0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  >zPath);.  }..  
1e7f0 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68  /* Also fsync th
1e800 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1e810 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  aining the file 
1e820 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20 66  if the DIRSYNC f
1e830 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e  lag.  ** is set.
1e840 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d    This is a one-
1e850 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e  time occurrence.
1e860 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28    Many systems (
1e870 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20  examples: AIX). 
1e880 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74   ** are unable t
1e890 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63 74  o fsync a direct
1e8a0 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65  ory, so ignore e
1e8b0 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79  rrors on the fsy
1e8c0 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nc..  */.  if( p
1e8d0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e8e0 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  & UNIXFILE_DIRSY
1e8f0 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69  NC ){.    int di
1e900 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rfd;.    OSTRACE
1e910 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28 68  (("DIRSYNC %s (h
1e920 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
1e930 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
1e940 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a  , pFile->zPath,.
1e950 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
1e960 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
1e970 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63  llsync));.    rc
1e980 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
1e990 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ry(pFile->zPath,
1e9a0 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
1e9b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e9c0 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73  ){.      full_fs
1e9d0 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29  ync(dirfd, 0, 0)
1e9e0 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
1e9f0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66  lose(pFile, dirf
1ea00 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
1ea10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1ea20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1ea30 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20  E_CANTOPEN );.  
1ea40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ea50 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
1ea60 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1ea70 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  = ~UNIXFILE_DIRS
1ea80 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  YNC;.  }.  retur
1ea90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1eaa0 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1eab0 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1eac0 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
1ead0 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
1eae0 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1eaf0 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
1eb00 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1eb10 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
1eb20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)id;.  int rc;.
1eb30 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1eb40 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1eb50 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1eb60 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1eb70 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  TE );..  /* If t
1eb80 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
1eb90 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
1eba0 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
1ebb0 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
1ebc0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
1ebd0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
1ebe0 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
1ebf0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
1ec00 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
1ec10 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
1ec20 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
1ec30 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
1ec40 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1ec50 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
1ec60 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1ec70 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
1ec80 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
1ec90 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
1eca0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
1ecb0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1ecc0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
1ecd0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75  rc = robust_ftru
1ece0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1ecf0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63  nByte);.  if( rc
1ed00 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1ed10 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
1ed20 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1ed30 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1ed40 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1ed50 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1ed60 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1ed70 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
1ed80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ed90 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1eda0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1edb0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1edc0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1edd0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
1ede0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1edf0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1ee00 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1ee10 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1ee20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
1ee30 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
1ee40 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
1ee50 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1ee60 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
1ee70 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
1ee80 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
1ee90 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
1eea0 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
1eeb0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
1eec0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
1eed0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
1eee0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
1eef0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
1ef00 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
1ef10 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1ef20 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
1ef30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
1ef40 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
1ef50 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
1ef60 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1ef70 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1ef80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
1ef90 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e  le was just trun
1efa0 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
1efb0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1efc0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
1efd0 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c  * mapped region,
1efe0 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1eff0 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69  ctive mapping si
1f000 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69  ze as well. SQLi
1f010 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75  te will.    ** u
1f020 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
1f030 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
1f040 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
1f050 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
1f060 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  on.  .    */.   
1f070 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65   if( nByte<pFile
1f080 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1f090 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1f0a0 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
1f0b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1f0c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f0d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1f0e0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1f0f0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1f100 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1f110 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1f120 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1f130 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1f140 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1f150 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1f160 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1f170 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1f180 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1f190 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1f1a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1f1b0 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1f1c0 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65  !=0 ){.    store
1f1d0 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
1f1e0 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b  ile*)id, errno);
1f1f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f200 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1f210 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
1f220 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
1f230 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1f240 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
1f250 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f  ase, the findIno
1f260 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  deInfo() procedu
1f270 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
1f280 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
1f290 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
1f2a0 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
1f2b0 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
1f2c0 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
1f2d0 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
1f2e0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1f2f0 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
1f300 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
1f310 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
1f320 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
1f330 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
1f340 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
1f350 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
1f360 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
1f370 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
1f380 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
1f390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f3a0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
1f3b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1f3c0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1f3d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
1f3e0 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70  ** Handler for p
1f3f0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c  roxy-locking fil
1f400 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e  e-control verbs.
1f410 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20    Defined below 
1f420 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69  in the.** proxyi
1f430 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73  ng locking divis
1f440 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1f450 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
1f460 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1f470 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65  *,int,void*);.#e
1f480 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  ndif../* .** Thi
1f490 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f4a0 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  lled to handle t
1f4b0 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
1f4c0 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69  SIZE_HINT .** fi
1f4d0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61  le-control opera
1f4e0 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74  tion.  Enlarge t
1f4f0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e  he database to n
1f500 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a  Bytes in size.**
1f510 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20   (rounded up to 
1f520 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73  the next chunk-s
1f530 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61  ize).  If the da
1f540 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1f550 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c  y.** nBytes or l
1f560 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74  arger, this rout
1f570 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1f580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63  */.static int fc
1f590 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78  ntlSizeHint(unix
1f5a0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34  File *pFile, i64
1f5b0 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70   nByte){.  if( p
1f5c0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1f5d0 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65  ){.    i64 nSize
1f5e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f5f0 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
1f600 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1f610 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1f620 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1f630 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20  /* Used to hold 
1f640 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  return values of
1f650 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a   fstat() */.   .
1f660 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1f670 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  pFile->h, &buf) 
1f680 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f6a0 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  AT;.    }..    n
1f6b0 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70  Size = ((nByte+p
1f6c0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29  File->szChunk-1)
1f6d0 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   / pFile->szChun
1f6e0 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1f6f0 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  unk;.    if( nSi
1f700 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73  ze>(i64)buf.st_s
1f710 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69  ize ){..#if defi
1f720 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
1f730 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
1f740 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1f750 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  E.      /* The c
1f760 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e  ode below is han
1f770 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  dling the return
1f780 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c   value of osFall
1f790 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a  ocate() .      *
1f7a0 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73  * correctly. pos
1f7b0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69  ix_fallocate() i
1f7c0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65  s defined to "re
1f7d0 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75  turns zero on su
1f7e0 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a  ccess, .      **
1f7f0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d   or an error num
1f800 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22  ber on  failure"
1f810 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67  . See the manpag
1f820 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  e for details. *
1f830 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b  /.      int err;
1f840 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
1f850 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f     err = osFallo
1f860 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62  cate(pFile->h, b
1f870 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a  uf.st_size, nSiz
1f880 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  e-buf.st_size);.
1f890 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72        }while( er
1f8a0 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  r==EINTR );.    
1f8b0 20 20 69 66 28 20 65 72 72 20 26 26 20 65 72 72    if( err && err
1f8c0 21 3d 45 49 4e 56 41 4c 20 29 20 72 65 74 75 72  !=EINVAL ) retur
1f8d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1f8e0 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RITE;.#else.    
1f8f0 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64    /* If the OS d
1f900 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73  oes not have pos
1f910 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20  ix_fallocate(), 
1f920 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61  fake it. Write a
1f930 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c   .      ** singl
1f940 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61  e byte to the la
1f950 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
1f960 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73  block that falls
1f970 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20   entirely.      
1f980 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ** within the ex
1f990 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54  tended region. T
1f9a0 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64  hen, if required
1f9b0 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  , a single byte.
1f9c0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
1f9d0 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f  et (nSize-1), to
1f9e0 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
1f9f0 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63   the file correc
1fa00 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  tly..      ** Th
1fa10 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20  is is a similar 
1fa20 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61  technique to tha
1fa30 74 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  t used by glibc 
1fa40 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20  on systems.     
1fa50 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20   ** that do not 
1fa60 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c  have a real fall
1fa70 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20  ocate() call..  
1fa80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
1fa90 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62   nBlk = buf.st_b
1faa0 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65  lksize;  /* File
1fab0 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69  -system block si
1fac0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ze */.      int 
1fad0 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20  nWrite = 0;     
1fae0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1faf0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1fb00 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  en by seekAndWri
1fb10 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  te */.      i64 
1fb20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  iWrite;         
1fb30 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1fb40 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  offset to write 
1fb50 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72  to */..      iWr
1fb60 69 74 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69  ite = (buf.st_si
1fb70 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20  ze/nBlk)*nBlk + 
1fb80 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20  nBlk - 1;.      
1fb90 61 73 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d  assert( iWrite>=
1fba0 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20  buf.st_size );. 
1fbb0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69       assert( ((i
1fbc0 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d  Write+1)%nBlk)==
1fbd0 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f  0 );.      for(/
1fbe0 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65  *no-op*/; iWrite
1fbf0 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69  <nSize+nBlk-1; i
1fc00 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20  Write+=nBlk ){. 
1fc10 20 20 20 20 20 20 20 69 66 28 20 69 57 72 69 74         if( iWrit
1fc20 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74  e>=nSize ) iWrit
1fc30 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20  e = nSize - 1;. 
1fc40 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
1fc50 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1fc60 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1fc70 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1fc80 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1fc90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1fca0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23  WRITE;.      }.#
1fcb0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1fcc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1fcd0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
1fce0 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1fcf0 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e  eMax>0 && nByte>
1fd00 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1fd10 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1fd20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
1fd30 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20  Chunk<=0 ){.    
1fd40 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1fd50 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1fd60 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
1fd70 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1fd80 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1fd90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fda0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1fdb0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1fdc0 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1fdd0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1fde0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1fdf0 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
1fe00 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
1fe10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1fe20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1fe30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fe40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
1fe50 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  Arg is initially
1fe60 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
1fe70 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
1fe80 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
1fe90 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
1fea0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1feb0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
1fec0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1fed0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
1fee0 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
1fef0 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
1ff00 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
1ff10 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
1ff20 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
1ff30 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69   void unixModeBi
1ff40 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1ff50 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
1ff60 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
1ff70 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
1ff80 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
1ff90 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
1ffa0 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
1ffb0 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
1ffc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
1ffd0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1ffe0 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
1fff0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
20000 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
20010 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
20020 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
20030 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
20040 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
20050 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b  uf, char *zBuf);
20060 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
20070 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
20080 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
20090 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
200a0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
200b0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
200c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
200d0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
200e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
200f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
20100 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
20110 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69  #if defined(__li
20120 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
20130 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
20140 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
20150 54 45 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  TE).    case SQL
20160 49 54 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f  ITE_FCNTL_BEGIN_
20170 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a  ATOMIC_WRITE: {.
20180 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f        int rc = o
20190 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sIoctl(pFile->h,
201a0 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f   F2FS_IOC_START_
201b0 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
201c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
201d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45   SQLITE_IOERR_BE
201e0 47 49 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c  GIN_ATOMIC : SQL
201f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
20200 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
20210 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  NTL_COMMIT_ATOMI
20220 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
20230 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
20240 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
20250 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  _IOC_COMMIT_ATOM
20260 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20  IC_WRITE);.     
20270 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
20280 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54  ITE_IOERR_COMMIT
20290 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45  _ATOMIC : SQLITE
202a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
202b0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
202c0 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43  _ROLLBACK_ATOMIC
202d0 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
202e0 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c  int rc = osIoctl
202f0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f  (pFile->h, F2FS_
20300 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49  IOC_ABORT_VOLATI
20310 4c 45 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20  LE_WRITE);.     
20320 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
20330 49 54 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41  ITE_IOERR_ROLLBA
20340 43 4b 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49  CK_ATOMIC : SQLI
20350 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
20360 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f  dif /* __linux__
20370 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
20380 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
20390 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73  RITE */..    cas
203a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
203b0 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
203c0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
203d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
203e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
203f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
20400 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20410 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f  FCNTL_LAST_ERRNO
20420 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
20430 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
20440 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
20450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20470 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
20480 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
20490 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
204a0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
204b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
204c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
204d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
204e0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
204f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
20500 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
20510 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
20520 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
20530 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
20540 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
20550 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
20560 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
20570 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20580 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
20590 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
205a0 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
205b0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
205c0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
205d0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
205e0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
205f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20600 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
20610 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
20620 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
20630 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
20640 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
20650 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
20660 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
20670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20680 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
20690 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
206a0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
206b0 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
206c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
206d0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
206e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
206f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
20710 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
20720 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
20730 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
20740 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
20750 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
20760 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
20770 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
20780 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74  .        unixGet
20790 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
207a0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
207b0 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20  , zTFile);.     
207c0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
207d0 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
207e0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
207f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
20800 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20810 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
20820 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
20830 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d  )pArg = fileHasM
20840 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  oved(pFile);.   
20850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20860 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  _OK;.    }.#ifde
20870 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20880 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20  SETLK_TIMEOUT.  
20890 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
208a0 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  NTL_LOCK_TIMEOUT
208b0 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
208c0 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  >iBusyTimeout = 
208d0 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20  *(int*)pArg;.   
208e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
208f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
20900 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
20910 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
20920 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
20930 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
20940 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
20950 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
20960 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
20970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20980 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
20990 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
209a0 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
209b0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
209c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
209d0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
209e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
209f0 65 20 76 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69  e value of newLi
20a00 6d 69 74 20 6d 61 79 20 62 65 20 65 76 65 6e 74  mit may be event
20a10 75 61 6c 6c 79 20 63 61 73 74 20 74 6f 20 28 73  ually cast to (s
20a20 69 7a 65 5f 74 29 20 61 6e 64 20 70 61 73 73 65  ize_t) and passe
20a30 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d  d.      ** to mm
20a40 61 70 28 29 2e 20 52 65 73 74 72 69 63 74 20 69  ap(). Restrict i
20a50 74 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20  ts value to 2GB 
20a60 69 66 20 28 73 69 7a 65 5f 74 29 20 69 73 20 6e  if (size_t) is n
20a70 6f 74 20 61 74 20 6c 65 61 73 74 20 61 0a 20 20  ot at least a.  
20a80 20 20 20 20 2a 2a 20 36 34 2d 62 69 74 20 74 79      ** 64-bit ty
20a90 70 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  pe. */.      if(
20aa0 20 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73   newLimit>0 && s
20ab0 69 7a 65 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20  izeof(size_t)<8 
20ac0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
20ad0 6d 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20  mit = (newLimit 
20ae0 26 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20  & 0x7FFFFFFF);. 
20af0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28       }..      *(
20b00 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  i64*)pArg = pFil
20b10 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  e->mmapSizeMax;.
20b20 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
20b30 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69  it>=0 && newLimi
20b40 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t!=pFile->mmapSi
20b50 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e  zeMax && pFile->
20b60 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a  nFetchOut==0 ){.
20b70 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
20b80 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
20b90 4c 69 6d 69 74 3b 0a 23 69 66 64 65 66 20 53 51  Limit;.#ifdef SQ
20ba0 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50  LITE_SHARED_MAPP
20bb0 49 4e 47 0a 20 20 20 20 20 20 20 20 69 66 28 20  ING.        if( 
20bc0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3d 3d 30  pFile->pInode==0
20bd0 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
20be0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
20bf0 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
20c00 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
20c10 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
20c20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61       rc = unixMa
20c30 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29  pfile(pFile, -1)
20c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20c50 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
20c60 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
20c70 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
20c80 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65  DEBUG.    /* The
20c90 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69   pager calls thi
20ca0 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e  s method to sign
20cb0 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64  al that it has d
20cc0 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c  one.    ** a rol
20cd0 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74  lback and that t
20ce0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
20cf0 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67  herefore unchang
20d00 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74  ed and.    ** it
20d10 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   hence it is OK 
20d20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  for the transact
20d30 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ion change count
20d40 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  er to be.    ** 
20d50 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a  unchanged..    *
20d60 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
20d70 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
20d80 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28  NGED: {.      ((
20d90 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64  unixFile*)id)->d
20da0 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
20db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20dc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
20dd0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
20de0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20df0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
20e00 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
20e10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
20e20 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
20e30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20e40 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50  _FCNTL_GET_LOCKP
20e50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
20e60 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
20e70 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
20e80 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
20e90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
20ea0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
20eb0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
20ec0 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
20ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20ee0 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
20ef0 2a 2a 20 49 66 20 70 46 64 2d 3e 73 65 63 74 6f  ** If pFd->secto
20f00 72 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  rSize is non-zer
20f10 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  o when this func
20f20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
20f30 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  it is a.** no-op
20f40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
20f50 20 76 61 6c 75 65 73 20 6f 66 20 70 46 64 2d 3e   values of pFd->
20f60 73 65 63 74 6f 72 53 69 7a 65 20 61 6e 64 20 0a  sectorSize and .
20f70 2a 2a 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68  ** pFd->deviceCh
20f80 61 72 61 63 74 65 72 69 73 74 69 63 73 20 61 72  aracteristics ar
20f90 65 20 73 65 74 20 61 63 63 6f 72 64 69 6e 67 20  e set according 
20fa0 74 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  to the file-syst
20fb0 65 6d 20 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  em .** character
20fc0 69 73 74 69 63 73 2e 20 0a 2a 2a 0a 2a 2a 20 54  istics. .**.** T
20fd0 68 65 72 65 20 61 72 65 20 74 77 6f 20 76 65 72  here are two ver
20fe0 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
20ff0 6e 63 74 69 6f 6e 2e 20 4f 6e 65 20 66 6f 72 20  nction. One for 
21000 51 4e 58 20 61 6e 64 20 6f 6e 65 20 66 6f 72 20  QNX and one for 
21010 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73  all.** other sys
21020 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
21030 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 73 74 61 74   __QNXNTO__.stat
21040 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63  ic void setDevic
21050 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21060 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
21070 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
21080 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
21090 73 74 69 63 73 3d 3d 30 20 7c 7c 20 70 46 64 2d  stics==0 || pFd-
210a0 3e 73 65 63 74 6f 72 53 69 7a 65 21 3d 30 20 29  >sectorSize!=0 )
210b0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 73 65 63  ;.  if( pFd->sec
210c0 74 6f 72 53 69 7a 65 3d 3d 30 20 29 7b 0a 23 69  torSize==0 ){.#i
210d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
210e0 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
210f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
21100 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
21110 29 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ).    int res;. 
21120 20 20 20 75 33 32 20 66 20 3d 20 30 3b 0a 0a 20     u32 f = 0;.. 
21130 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
21140 73 75 70 70 6f 72 74 20 66 6f 72 20 46 32 46 53  support for F2FS
21150 20 61 74 6f 6d 69 63 20 62 61 74 63 68 20 77 72   atomic batch wr
21160 69 74 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 73  ites. */.    res
21170 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 64 2d 3e   = osIoctl(pFd->
21180 68 2c 20 46 32 46 53 5f 49 4f 43 5f 47 45 54 5f  h, F2FS_IOC_GET_
21190 46 45 41 54 55 52 45 53 2c 20 26 66 29 3b 0a 20  FEATURES, &f);. 
211a0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26     if( res==0 &&
211b0 20 28 66 20 26 20 46 32 46 53 5f 46 45 41 54 55   (f & F2FS_FEATU
211c0 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29  RE_ATOMIC_WRITE)
211d0 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64   ){.      pFd->d
211e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
211f0 74 69 63 73 20 3d 20 53 51 4c 49 54 45 5f 49 4f  tics = SQLITE_IO
21200 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
21210 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
21220 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53  * __linux__ && S
21230 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
21240 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  CH_ATOMIC_WRITE 
21250 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
21260 68 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  he POWERSAFE_OVE
21270 52 57 52 49 54 45 20 66 6c 61 67 20 69 66 20 72  RWRITE flag if r
21280 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
21290 20 69 66 28 20 70 46 64 2d 3e 63 74 72 6c 46 6c   if( pFd->ctrlFl
212a0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
212b0 53 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 46 64  SOW ){.      pFd
212c0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
212d0 72 69 73 74 69 63 73 20 7c 3d 20 53 51 4c 49 54  ristics |= SQLIT
212e0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
212f0 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 20  E_OVERWRITE;.   
21300 20 7d 0a 0a 20 20 20 20 70 46 64 2d 3e 73 65 63   }..    pFd->sec
21310 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
21320 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
21330 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  SIZE;.  }.}.#els
21340 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  e.#include <sys/
21350 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63  dcmd_blk.h>.#inc
21360 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66  lude <sys/statvf
21370 73 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  s.h>.static void
21380 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63   setDeviceCharac
21390 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46 69  teristics(unixFi
213a0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
213b0 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ( pFile->sectorS
213c0 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ize == 0 ){.    
213d0 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20 66  struct statvfs f
213e0 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20  sInfo;.       . 
213f0 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c     /* Set defaul
21400 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f  ts for non-suppo
21410 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 73  rted filesystems
21420 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   */.    pFile->s
21430 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
21440 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
21450 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c  R_SIZE;.    pFil
21460 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
21470 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
21480 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28 70    if( fstatvfs(p
21490 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f  File->h, &fsInfo
214a0 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
214b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
214c0 0a 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70  .    if( !strcmp
214d0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
214e0 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20  pe, "tmp") ) {. 
214f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
21500 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
21510 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
21520 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
21530 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
21540 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
21550 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20  AP_ATOMIC4K |   
21560 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66      /* All ram f
21570 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73  ilesystem writes
21580 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
21590 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
215a0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
215b0 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
215c0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
215d0 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
21610 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
21620 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
21630 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
21640 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
21650 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
21660 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21690 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
216a0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
216b0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
216c0 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
216d0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74  .f_basetype, "et
216e0 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  fs") ){.      pF
216f0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
21700 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
21710 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
21720 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
21730 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
21740 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73  * etfs cluster s
21750 69 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61  ize writes are a
21760 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
21770 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53   (pFile->sectorS
21780 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
21790 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
217a0 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51  12) |.        SQ
217b0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
217c0 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
217d0 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
217e0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
217f0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
21820 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
21830 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
21840 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
21850 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
21860 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
21870 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
21880 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
218b0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
218c0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
218d0 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
218e0 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
218f0 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a  ype, "qnx6") ){.
21900 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
21910 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
21920 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
21930 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
21940 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
21950 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
21960 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20  CAP_ATOMIC |    
21970 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65       /* All file
21980 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72  system writes ar
21990 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
219a0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
219b0 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
219c0 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
219d0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
219e0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
21a20 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
21a30 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
21a40 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
21a50 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
21a60 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
21a70 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
21ab0 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
21ac0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21ad0 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
21ae0 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34  _basetype, "qnx4
21af0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
21b00 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
21b10 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
21b20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
21b30 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21b40 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
21b50 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
21b60 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
21b70 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
21b80 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
21b90 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
21ba0 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
21bb0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
21bc0 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
21bd0 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
21be0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
21bf0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
21c00 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
21c10 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
21c20 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
21c50 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
21c60 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
21c70 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28  else if( strstr(
21c80 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
21c90 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20  e, "dos") ){.   
21ca0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
21cb0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
21cc0 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
21cd0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
21ce0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
21cf0 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
21d00 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
21d10 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
21d20 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
21d30 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
21d40 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
21d50 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
21d60 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
21d70 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
21d80 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
21d90 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
21da0 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
21db0 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
21dc0 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
21e00 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
21e10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21e20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
21e30 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
21e40 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
21e50 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
21e60 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b   |      /* block
21e70 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
21e80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
21e90 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
21ea0 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
21eb0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
21ec0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
21f00 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
21f10 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20        0;.    }. 
21f20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61   }.  /* Last cha
21f30 6e 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  nce verification
21f40 2e 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72  .  If the sector
21f50 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75   size isn't a mu
21f60 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20  ltiple of 512.  
21f70 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74  ** then it isn't
21f80 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20   valid.*/.  if( 
21f90 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
21fa0 65 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a  e % 512 != 0 ){.
21fb0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
21fc0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21fd0 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
21fe0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
21ff0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
22000 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a  TOR_SIZE;.  }.}.
22010 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22020 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
22030 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
22040 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
22050 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
22060 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
22070 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
22080 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
22090 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
220a0 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
220b0 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
220c0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
220d0 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
220e0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
220f0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
22100 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
22110 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
22120 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
22130 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
22140 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
22150 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
22160 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
22170 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
22180 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
22190 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
221a0 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
221b0 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
221c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
221d0 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
221e0 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
221f0 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63  *)id;.  setDevic
22200 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
22210 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pFd);.  return 
22220 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  pFd->sectorSize;
22230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22240 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
22250 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
22260 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
22270 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20  This VFS is set 
22280 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  up to return SQL
22290 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
222a0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79  AFE_OVERWRITE by
222b0 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77   default..** How
222c0 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63  ever, that choic
222d0 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69  e is controversi
222e0 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63  al since technic
222f0 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79  ally the underly
22300 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74  ing.** file syst
22310 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61  em does not alwa
22320 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72  ys provide power
22330 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e  safe overwrites.
22340 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77    (In other.** w
22350 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f  ords, after a po
22360 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20  wer-loss event, 
22370 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c  parts of the fil
22380 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65  e that were neve
22390 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67  r.** written mig
223a0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
223b0 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76  altered.)  Howev
223c0 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68  er, non-PSOW beh
223d0 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a  avior is very,.*
223e0 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e  * very rare.  An
223f0 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57  d asserting PSOW
22400 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72   makes a large r
22410 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  eduction in the 
22420 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71  amount.** of req
22430 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f  uired I/O for jo
22440 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20  urnaling, since 
22450 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67  a lot of padding
22460 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   is eliminated..
22470 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65  **  Hence, while
22480 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
22490 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65  RITE is on by de
224a0 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20  fault, there is 
224b0 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a  a file-control.*
224c0 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  * available to t
224d0 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55  urn it off and U
224e0 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  RI query paramet
224f0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  er available to 
22500 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a  turn it off..*/.
22510 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
22520 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22530 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
22540 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
22550 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
22560 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65  ile*)id;.  setDe
22570 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
22580 69 63 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75  ics(pFd);.  retu
22590 72 6e 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68  rn pFd->deviceCh
225a0 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 7d  aracteristics;.}
225b0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
225c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
225d0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
225e0 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a  AP_SIZE>0../*.**
225f0 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74   Return the syst
22600 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  em page size..**
22610 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22620 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
22630 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20  called directly 
22640 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e  by other code in
22650 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20   this file. .** 
22660 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75  Instead, it shou
22670 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61  ld be called via
22680 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65   macro osGetpage
22690 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  size()..*/.stati
226a0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67  c int unixGetpag
226b0 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66  esize(void){.#if
226c0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65   OS_VXWORKS.  re
226d0 74 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66  turn 1024;.#elif
226e0 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f   defined(_BSD_SO
226f0 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67  URCE).  return g
22700 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65  etpagesize();.#e
22710 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  lse.  return (in
22720 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41  t)sysconf(_SC_PA
22730 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a  GESIZE);.#endif.
22740 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  }..#endif /* !de
22750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22760 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
22770 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
22780 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
22790 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
227a0 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
227b0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
227c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
227d0 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
227e0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
227f0 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
22800 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
22810 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
22820 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
22830 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
22840 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
22850 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
22860 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
22870 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
22880 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
22890 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
228a0 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
228b0 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
228c0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
228d0 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
228e0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
228f0 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
22900 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
22910 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
22920 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
22930 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
22940 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
22950 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
22960 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
22970 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
22980 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
22990 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
229a0 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
229b0 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
229c0 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
229d0 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
229e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
229f0 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
22a00 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
22a10 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
22a20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
22a30 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
22a40 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
22a50 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
22a60 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
22a70 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
22a80 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
22a90 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
22aa0 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
22ab0 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
22ac0 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
22ad0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
22ae0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
22af0 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
22b00 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
22b10 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
22b20 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
22b30 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
22b40 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
22b50 2a 2a 20 20 20 20 20 20 68 53 68 6d 0a 2a 2a 20  **      hShm.** 
22b60 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
22b70 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78  *.** Either unix
22b80 53 68 6d 4e 6f 64 65 2e 70 53 68 6d 4d 75 74 65  ShmNode.pShmMute
22b90 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
22ba0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
22bb0 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
22bc0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
22bd0 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
22be0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
22bf0 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
22c00 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
22c10 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
22c20 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
22c30 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
22c40 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
22c50 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
22c60 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
22c70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
22c80 74 65 78 20 2a 70 53 68 6d 4d 75 74 65 78 3b 20  tex *pShmMutex; 
22c90 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
22ca0 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
22cb0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
22cc0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
22cd0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
22ce0 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
22cf0 20 69 6e 74 20 68 53 68 6d 3b 20 20 20 20 20 20   int hShm;      
22d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22d10 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
22d20 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
22d30 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
22d40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
22d50 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
22d60 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
22d70 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
22d80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22d90 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
22da0 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
22db0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
22dc0 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
22dd0 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 69 73 55 6e  nly */.  u8 isUn
22de0 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20  locked;         
22df0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
22e00 6f 20 44 4d 53 20 6c 6f 63 6b 20 68 65 6c 64 20  o DMS lock held 
22e10 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65  */.  char **apRe
22e20 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
22e30 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70  /* Array of mapp
22e40 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
22e50 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
22e60 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
22e70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22e80 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62  er of unixShm ob
22e90 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
22ea0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78  o this */.  unix
22eb0 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
22ec0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e         /* All un
22ed0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
22ee0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
22ef0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
22f00 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d  DEBUG.  u8 exclM
22f10 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
22f20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
22f30 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
22f40 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65  ld */.  u8 share
22f50 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
22f60 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
22f70 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
22f80 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  */.  u8 nextShmI
22f90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
22fa0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
22fb0 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c  e unixShm.id val
22fc0 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  ue */.#endif..#i
22fd0 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45  fdef SQLITE_MUTE
22fe0 58 46 52 45 45 5f 53 48 4d 4c 4f 43 4b 0a 20 20  XFREE_SHMLOCK.  
22ff0 2f 2a 20 49 6e 20 75 6e 69 78 2d 65 78 63 6c 20  /* In unix-excl 
23000 6d 6f 64 65 2c 20 69 66 20 53 51 4c 49 54 45 5f  mode, if SQLITE_
23010 4d 55 54 45 58 46 52 45 45 5f 53 48 4d 4c 4f 43  MUTEXFREE_SHMLOC
23020 4b 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6c  K is defined, al
23030 6c 20 6c 6f 63 6b 73 0a 20 20 2a 2a 20 61 72 65  l locks.  ** are
23040 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66   stored in the f
23050 6f 6c 6c 6f 77 69 6e 67 20 36 34 2d 62 69 74 20  ollowing 64-bit 
23060 76 61 6c 75 65 2e 20 54 68 65 72 65 20 61 72 65  value. There are
23070 20 69 6e 20 74 6f 74 61 6c 20 38 20 0a 20 20 2a   in total 8 .  *
23080 2a 20 73 68 6d 2d 6c 6f 63 6b 69 6e 67 20 73 6c  * shm-locking sl
23090 6f 74 73 2c 20 65 61 63 68 20 6f 66 20 77 68 69  ots, each of whi
230a0 63 68 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ch are assigned 
230b0 38 2d 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  8-bits from the 
230c0 36 34 2d 62 69 74 0a 20 20 2a 2a 20 76 61 6c 75  64-bit.  ** valu
230d0 65 2e 20 54 68 65 20 6c 65 61 73 74 2d 73 69 67  e. The least-sig
230e0 6e 69 66 69 63 61 6e 74 20 38 20 62 69 74 73 20  nificant 8 bits 
230f0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 73 68  correspond to sh
23100 6d 2d 6c 6f 63 6b 69 6e 67 20 73 6c 6f 74 0a 20  m-locking slot. 
23110 20 2a 2a 20 30 2c 20 61 6e 64 20 73 6f 20 6f 6e   ** 0, and so on
23120 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
23130 68 65 20 38 2d 62 69 74 73 20 63 6f 72 72 65 73  he 8-bits corres
23140 70 6f 6e 64 69 6e 67 20 74 6f 20 61 20 73 68 6d  ponding to a shm
23150 2d 6c 6f 63 6b 69 6e 67 20 6c 6f 63 6b 69 6e 67  -locking locking
23160 20 73 6c 6f 74 20 61 72 65 20 73 65 74 20 74 6f   slot are set to
23170 0a 20 20 2a 2a 20 30 78 46 46 2c 20 74 68 65 6e  .  ** 0xFF, then
23180 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73   a write-lock is
23190 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 6c 6f   held on the slo
231a0 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 79 20 61  t. Or, if they a
231b0 72 65 20 73 65 74 20 74 6f 0a 20 20 2a 2a 20 61  re set to.  ** a
231c0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
231d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 30 78 46  smaller than 0xF
231e0 46 2c 20 74 68 65 6e 20 74 68 65 79 20 72 65 70  F, then they rep
231f0 72 65 73 65 6e 74 20 74 68 65 20 74 6f 74 61 6c  resent the total
23200 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
23210 20 72 65 61 64 2d 6c 6f 63 6b 73 20 68 65 6c 64   read-locks held
23220 20 6f 6e 20 74 68 65 20 73 6c 6f 74 2e 20 54 68   on the slot. Th
23230 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
23240 20 64 69 73 74 69 6e 67 75 69 73 68 0a 20 20 2a   distinguish.  *
23250 2a 20 62 65 74 77 65 65 6e 20 61 20 77 72 69 74  * between a writ
23260 65 2d 6c 6f 63 6b 20 61 6e 64 20 32 35 35 20 72  e-lock and 255 r
23270 65 61 64 2d 6c 6f 63 6b 73 2e 20 20 2a 2f 0a 20  ead-locks.  */. 
23280 20 75 36 34 20 6c 6f 63 6b 6d 61 73 6b 3b 0a 23   u64 lockmask;.#
23290 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
232a0 41 74 6f 6d 69 63 20 43 41 53 20 70 72 69 6d 69  Atomic CAS primi
232b0 74 69 76 65 20 75 73 65 64 20 69 6e 20 6d 75 6c  tive used in mul
232c0 74 69 2d 70 72 6f 63 65 73 73 20 6d 6f 64 65 2e  ti-process mode.
232d0 20 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   Equivalent to:.
232e0 2a 2a 20 0a 2a 2a 20 20 20 69 6e 74 20 75 6e 69  ** .**   int uni
232f0 78 43 6f 6d 70 61 72 65 41 6e 64 53 77 61 70 28  xCompareAndSwap(
23300 75 33 32 20 2a 70 74 72 2c 20 75 33 32 20 6f 6c  u32 *ptr, u32 ol
23310 64 76 61 6c 2c 20 75 33 32 20 6e 65 77 76 61 6c  dval, u32 newval
23320 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 2a 70  ){.**     if( *p
23330 74 72 3d 3d 6f 6c 64 76 61 6c 20 29 7b 0a 2a 2a  tr==oldval ){.**
23340 20 20 20 20 20 20 20 2a 70 74 72 20 3d 20 6e 65         *ptr = ne
23350 77 76 61 6c 3b 0a 2a 2a 20 20 20 20 20 20 20 72  wval;.**       r
23360 65 74 75 72 6e 20 31 3b 0a 2a 2a 20 20 20 20 20  eturn 1;.**     
23370 7d 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  }.**     return 
23380 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 23 64 65  0;.**   }.*/.#de
23390 66 69 6e 65 20 75 6e 69 78 43 6f 6d 70 61 72 65  fine unixCompare
233a0 41 6e 64 53 77 61 70 28 70 74 72 2c 6f 6c 64 76  AndSwap(ptr,oldv
233b0 61 6c 2c 6e 65 77 76 61 6c 29 20 5c 0a 20 20 20  al,newval) \.   
233c0 20 5f 5f 73 79 6e 63 5f 62 6f 6f 6c 5f 63 6f 6d   __sync_bool_com
233d0 70 61 72 65 5f 61 6e 64 5f 73 77 61 70 28 70 74  pare_and_swap(pt
233e0 72 2c 6f 6c 64 76 61 6c 2c 6e 65 77 76 61 6c 29  r,oldval,newval)
233f0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  .../*.** Structu
23400 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
23410 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
23420 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
23430 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
23440 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
23450 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
23460 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
23470 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
23480 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
23490 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
234a0 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
234b0 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
234c0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78  r:.**.**    unix
234d0 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20  Shm.pShmNode.** 
234e0 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a     unixShm.id.**
234f0 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
23500 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
23510 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68  ite.  The unixSh
23520 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  m.pShmNode->pShm
23530 4d 75 74 65 78 20 6d 75 73 74 0a 2a 2a 20 62 65  Mutex must.** be
23540 20 68 65 6c 64 20 77 68 69 6c 65 20 61 63 63 65   held while acce
23550 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
23560 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
23570 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
23580 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
23590 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a  pShmNode;     /*
235a0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
235b0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
235c0 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
235d0 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
235e0 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
235f0 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
23600 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
23610 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23630 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
23640 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2d  the unixShmNode-
23650 3e 70 53 68 6d 4d 75 74 65 78 20 2a 2f 0a 20 20  >pShmMutex */.  
23660 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
23670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
23680 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
23690 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75  ion within its u
236a0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
236b0 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
236c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
236d0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
236e0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
236f0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
23700 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
23710 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
23720 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f  ks held */.};../
23730 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
23740 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
23750 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
23760 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
23770 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
23780 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20  )*4)         /* 
23790 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
237a0 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
237b0 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58  SHM_DMS    (UNIX
237c0 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
237d0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
237e0 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
237f0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70  /../*.** Apply p
23800 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
23810 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65  cks for all byte
23820 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f  s from ofst thro
23830 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a  ugh ofst+n-1..**
23840 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20  .** Locks block 
23850 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65  if the mask is e
23860 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f  xactly UNIX_SHM_
23870 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c  C and are non-bl
23880 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77  ocking.** otherw
23890 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
238a0 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  nt unixShmSystem
238b0 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69 6c 65  Lock(.  unixFile
238c0 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f   *pFile,       /
238d0 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f  * Open connectio
238e0 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  n to the WAL fil
238f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  e */.  int lockT
23900 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ype,          /*
23910 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43   F_UNLCK, F_RDLC
23920 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f  K, or F_WRLCK */
23930 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
23940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23950 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c  st byte of the l
23960 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a  ocking range */.
23970 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20    int n         
23980 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23990 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
239a0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
239b0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
239c0 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b  e; /* Apply lock
239d0 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
239e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
239f0 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75 63 74  ment */.  struct
23a00 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20   flock f;       
23a10 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64   /* The posix ad
23a20 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73  visory locking s
23a30 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
23a40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23a50 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63  ;    /* Result c
23a60 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29  ode form fcntl()
23a70 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
23a80 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   to the unixShmN
23a90 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
23aa0 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
23ab0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53 68 6d  caller */.  pShm
23ac0 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  Node = pFile->pI
23ad0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
23ae0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
23af0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 73  de->nRef==0 || s
23b00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23b10 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  d(pShmNode->pShm
23b20 4d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  Mutex) );.  asse
23b30 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
23b40 65 66 3e 30 20 7c 7c 20 75 6e 69 78 4d 75 74 65  ef>0 || unixMute
23b50 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
23b60 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
23b70 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
23b80 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
23b90 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
23ba0 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
23bb0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
23bc0 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
23bd0 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
23be0 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54  n>=1 && n<=SQLIT
23bf0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a  E_SHM_NLOCK );..
23c00 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
23c10 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  hShm>=0 ){.    /
23c20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
23c30 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
23c40 65 72 73 20 2a 2f 0a 20 20 20 20 66 2e 6c 5f 74  ers */.    f.l_t
23c50 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
23c60 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
23c70 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
23c80 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
23c90 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
23ca0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74  ;.    rc = osSet
23cb0 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63  PosixAdvisoryLoc
23cc0 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  k(pShmNode->hShm
23cd0 2c 20 26 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20  , &f, pFile);.  
23ce0 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
23cf0 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
23d00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
23d10 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
23d20 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
23d30 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
23d40 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
23d50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
23d60 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20    { u16 mask;.  
23d70 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
23d80 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d  CK "));.  mask =
23d90 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66   ofst>31 ? 0xfff
23da0 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  f : (1<<(ofst+n)
23db0 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
23dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23dd0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  OK ){.    if( lo
23de0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
23df0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
23e00 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22  (("unlock %d ok"
23e10 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
23e20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
23e30 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
23e40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
23e50 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
23e60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
23e70 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
23e80 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
23e90 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25  CE(("read-lock %
23ea0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
23eb0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
23ec0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
23ed0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
23ee0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
23ef0 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mask;.    }else{
23f00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
23f10 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
23f20 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
23f30 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
23f40 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
23f50 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
23f60 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
23f70 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
23f80 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
23f90 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
23fa0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  lse{.    if( loc
23fb0 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
23fc0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
23fd0 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ("unlock %d fail
23fe0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
23ff0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
24000 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
24010 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
24020 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  read-lock failed
24030 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "));.    }else{.
24040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
24050 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
24060 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
24070 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
24080 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
24090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
240a0 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72  TRACE((" - after
240b0 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c  wards %03x,%03x\
240c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
240d0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
240e0 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65  ask, pShmNode->e
240f0 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23  xclMask));.  }.#
24100 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
24110 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  rc;        .}../
24120 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24130 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  minimum number o
24140 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f  f 32KB shm regio
24150 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ns that should b
24160 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61  e mapped at.** a
24170 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20   time, assuming 
24180 74 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e  that each mappin
24190 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  g must be an int
241a0 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
241b0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
241c0 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65  system page-size
241d0 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c  ..**.** Usually,
241e0 20 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20   this is 1. The 
241f0 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20  exception seems 
24200 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68  to be systems th
24210 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65  at are configure
24220 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42  d.** to use 64KB
24230 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73   pages - in this
24240 20 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69   case each mappi
24250 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74  ng must cover at
24260 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68   least two.** sh
24270 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  m regions..*/.st
24280 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
24290 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69  RegionPerMap(voi
242a0 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20  d){.  int shmsz 
242b0 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20  = 32*1024;      
242c0 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67        /* SHM reg
242d0 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  ion size */.  in
242e0 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61  t pgsz = osGetpa
242f0 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53  gesize();   /* S
24300 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20  ystem page size 
24310 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70  */.  assert( ((p
24320 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20  gsz-1)&pgsz)==0 
24330 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  );   /* Page siz
24340 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
24350 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20  r of 2 */.  if( 
24360 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74  pgsz<shmsz ) ret
24370 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
24380 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f  pgsz/shmsz;.}../
24390 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
243a0 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  nixShmNodeList l
243b0 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
243c0 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e  es with unixShmN
243d0 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
243e0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
243f0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
24400 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
24410 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
24420 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
24430 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
24440 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
24450 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
24460 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65  hmPurge(unixFile
24470 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68   *pFd){.  unixSh
24480 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e  mNode *p = pFd->
24490 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
244a0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
244b0 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
244c0 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
244d0 28 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a  (p->nRef==0) ){.
244e0 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d      int nShmPerM
244f0 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
24500 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20  onPerMap();.    
24510 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
24520 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
24530 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
24540 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
24550 72 65 65 28 70 2d 3e 70 53 68 6d 4d 75 74 65 78  ree(p->pShmMutex
24560 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
24570 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
24580 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20  =nShmPerMap){.  
24590 20 20 20 20 69 66 28 20 70 2d 3e 68 53 68 6d 3e      if( p->hShm>
245a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  =0 ){.        os
245b0 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69  Munmap(p->apRegi
245c0 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69  on[i], p->szRegi
245d0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  on);.      }else
245e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
245f0 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
24600 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  on[i]);.      }.
24610 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24620 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
24630 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
24640 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  hShm>=0 ){.     
24650 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
24660 64 2c 20 70 2d 3e 68 53 68 6d 2c 20 5f 5f 4c 49  d, p->hShm, __LI
24670 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
24680 68 53 68 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  hShm = -1;.    }
24690 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
246a0 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
246b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
246c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
246d0 54 68 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73  The DMS lock has
246e0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61   not yet been ta
246f0 6b 65 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20  ken on shm file 
24700 70 53 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70  pShmNode. Attemp
24710 74 20 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20  t to.** take it 
24720 6e 6f 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  now. Return SQLI
24730 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
24740 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
24750 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
24760 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
24770 20 49 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e   If the DMS cann
24780 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63  ot be locked bec
24790 61 75 73 65 20 74 68 69 73 20 69 73 20 61 20 72  ause this is a r
247a0 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a  eadonly_shm=1 .*
247b0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  * connection and
247c0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
247d0 73 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  s already holds 
247e0 61 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a  a lock, return.*
247f0 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  * SQLITE_READONL
24800 59 5f 43 41 4e 54 49 4e 49 54 20 61 6e 64 20 73  Y_CANTINIT and s
24810 65 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55  et pShmNode->isU
24820 6e 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74  nlocked=1..*/.st
24830 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
24840 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  kSharedMemory(un
24850 69 78 46 69 6c 65 20 2a 70 44 62 46 64 2c 20 75  ixFile *pDbFd, u
24860 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
24870 4e 6f 64 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Node){.  struct 
24880 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
24890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
248a0 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 46 5f 47 45  ;..  /* Use F_GE
248b0 54 4c 4b 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  TLK to determine
248c0 20 74 68 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72   the locks other
248d0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 68   processes are h
248e0 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74  olding.  ** on t
248f0 68 65 20 44 4d 53 20 62 79 74 65 2e 20 49 66 20  he DMS byte. If 
24900 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
24910 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  t another proces
24920 73 20 69 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a  s is holding.  *
24930 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  * a SHARED lock,
24940 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65   then this proce
24950 73 73 20 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65  ss may also take
24960 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
24970 20 2a 2a 20 61 6e 64 20 70 72 6f 63 65 65 64 20   ** and proceed 
24980 77 69 74 68 20 6f 70 65 6e 69 6e 67 20 74 68 65  with opening the
24990 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20   *-shm file. .  
249a0 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e  **.  ** Or, if n
249b0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
249c0 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  is holding any l
249d0 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ock, then this p
249e0 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 74  rocess.  ** is t
249f0 68 65 20 66 69 72 73 74 20 74 6f 20 6f 70 65 6e  he first to open
24a00 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73   it. In this cas
24a10 65 20 74 61 6b 65 20 61 6e 20 45 58 43 4c 55 53  e take an EXCLUS
24a20 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
24a30 20 20 2a 2a 20 44 4d 53 20 62 79 74 65 20 61 6e    ** DMS byte an
24a40 64 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 2a  d truncate the *
24a50 2d 73 68 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72  -shm file to zer
24a60 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
24a70 20 54 68 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67   Then.  ** downg
24a80 72 61 64 65 20 74 6f 20 61 20 53 48 41 52 45 44  rade to a SHARED
24a90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53   lock on the DMS
24aa0 20 62 79 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   byte..  **.  **
24ab0 20 49 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   If another proc
24ac0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
24ad0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
24ae0 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65   on the DMS byte
24af0 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  ,.  ** return SQ
24b00 4c 49 54 45 5f 42 55 53 59 20 74 6f 20 74 68 65  LITE_BUSY to the
24b10 20 63 61 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c   caller (it will
24b20 20 74 72 79 20 61 67 61 69 6e 29 2e 20 41 6e 20   try again). An 
24b30 65 61 72 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72  earlier.  ** ver
24b40 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 63 6f 64  sion of this cod
24b50 65 20 61 74 74 65 6d 70 74 65 64 20 74 68 65 20  e attempted the 
24b60 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 74 20 74  SHARED lock at t
24b70 68 69 73 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20  his point. But. 
24b80 20 2a 2a 20 74 68 69 73 20 69 6e 74 72 6f 64 75   ** this introdu
24b90 63 65 64 20 61 20 73 75 62 74 6c 65 20 72 61 63  ced a subtle rac
24ba0 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20  e condition: if 
24bb0 74 68 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  the process hold
24bc0 69 6e 67 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49  ing.  ** EXCLUSI
24bd0 56 45 20 66 61 69 6c 65 64 20 6a 75 73 74 20 62  VE failed just b
24be0 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
24bf0 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c   the *-shm file,
24c00 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20   then this.  ** 
24c10 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
24c20 65 6e 20 61 6e 64 20 75 73 65 20 74 68 65 20 2a  en and use the *
24c30 2d 73 68 6d 20 66 69 6c 65 20 77 69 74 68 6f 75  -shm file withou
24c40 74 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  t truncating it.
24c50 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
24c60 20 2a 2d 73 68 6d 20 66 69 6c 65 20 68 61 73 20   *-shm file has 
24c70 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64 20 62  been corrupted b
24c80 79 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  y a power failur
24c90 65 20 6f 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d  e or.  ** system
24ca0 20 63 72 61 73 68 2c 20 74 68 65 20 64 61 74 61   crash, the data
24cb0 62 61 73 65 20 69 74 73 65 6c 66 20 6d 61 79 20  base itself may 
24cc0 61 6c 73 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72  also become corr
24cd0 75 70 74 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  upt.  */.  lock.
24ce0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
24cf0 53 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74  SET;.  lock.l_st
24d00 61 72 74 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44  art = UNIX_SHM_D
24d10 4d 53 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  MS;.  lock.l_len
24d20 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74   = 1;.  lock.l_t
24d30 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
24d40 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 53 68   if( osFcntl(pSh
24d50 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 46 5f 47  mNode->hShm, F_G
24d60 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
24d70 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ) {.    rc = SQL
24d80 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
24d90 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
24da0 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
24db0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   ){.    if( pShm
24dc0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
24dd0 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   ){.      pShmNo
24de0 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d  de->isUnlocked =
24df0 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
24e00 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
24e10 41 4e 54 49 4e 49 54 3b 0a 20 20 20 20 7d 65 6c  ANTINIT;.    }el
24e20 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  se{.      rc = u
24e30 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
24e40 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c  (pDbFd, F_WRLCK,
24e50 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
24e60 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
24e70 66 69 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  first connection
24e80 20 74 6f 20 61 74 74 61 63 68 20 6d 75 73 74 20   to attach must 
24e90 74 72 75 6e 63 61 74 65 20 74 68 65 20 2d 73 68  truncate the -sh
24ea0 6d 20 66 69 6c 65 2e 20 20 57 65 0a 20 20 20 20  m file.  We.    
24eb0 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 6f    ** truncate to
24ec0 20 33 20 62 79 74 65 73 20 28 61 6e 20 61 72 62   3 bytes (an arb
24ed0 69 74 72 61 72 79 20 73 6d 61 6c 6c 20 6e 75 6d  itrary small num
24ee0 62 65 72 2c 20 6c 65 73 73 20 74 68 61 6e 20 74  ber, less than t
24ef0 68 65 0a 20 20 20 20 20 20 2a 2a 20 2d 73 68 6d  he.      ** -shm
24f00 20 68 65 61 64 65 72 20 73 69 7a 65 29 20 72 61   header size) ra
24f10 74 68 65 72 20 74 68 61 6e 20 30 20 61 73 20 61  ther than 0 as a
24f20 20 73 79 73 74 65 6d 20 64 65 62 75 67 67 69 6e   system debuggin
24f30 67 20 61 69 64 2c 20 74 6f 0a 20 20 20 20 20 20  g aid, to.      
24f40 2a 2a 20 68 65 6c 70 20 64 65 74 65 63 74 20 69  ** help detect i
24f50 66 20 61 20 2d 73 68 6d 20 66 69 6c 65 20 74 72  f a -shm file tr
24f60 75 6e 63 61 74 69 6f 6e 20 69 73 20 6c 65 67 69  uncation is legi
24f70 74 69 6d 61 74 65 20 6f 72 20 69 73 20 74 68 65  timate or is the
24f80 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 6f   work.      ** o
24f90 72 20 61 20 72 6f 67 75 65 20 70 72 6f 63 65 73  r a rogue proces
24fa0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
24fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24fc0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
24fd0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  e(pShmNode->hShm
24fe0 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 3) ){.        
24ff0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
25000 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
25010 48 4d 4f 50 45 4e 2c 22 66 74 72 75 6e 63 61 74  HMOPEN,"ftruncat
25020 65 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  e",pShmNode->zFi
25030 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
25040 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
25050 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  f( lock.l_type==
25060 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 72  F_WRLCK ){.    r
25070 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
25080 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
25090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
250a0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 2e 6c 5f   assert( lock.l_
250b0 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 7c 7c  type==F_UNLCK ||
250c0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f   lock.l_type==F_
250d0 52 44 4c 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  RDLCK );.    rc 
250e0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
250f0 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c  ock(pDbFd, F_RDL
25100 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
25110 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
25120 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25130 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65  Open a shared-me
25140 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
25150 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64  ated with open d
25160 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
25170 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61  Fd.  .** This pa
25180 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65  rticular impleme
25190 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61  ntation uses mma
251a0 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
251b0 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20  * The file used 
251c0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61  to implement sha
251d0 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e  red-memory is in
251e0 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
251f0 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70  ory.** as the op
25200 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
25210 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
25220 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70  e name as the op
25230 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  en database.** f
25240 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73  ile with the "-s
25250 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64  hm" suffix added
25260 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
25270 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
25280 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d  file.** is "/hom
25290 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
252a0 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  b" then the file
252b0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
252c0 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20   and mmapped.** 
252d0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
252e0 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  y will be called
252f0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
25300 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a  nfig.db-shm".  .
25310 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70  **.** Another ap
25320 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20  proach to is to 
25330 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65  use files in /de
25340 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d  v/shm or /dev/tm
25350 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20  p or an.** some 
25360 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e  other tmpfs moun
25370 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65  t. But if a file
25380 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
25390 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f  directory.** fro
253a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
253b0 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  ile is used, the
253c0 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65  n differing acce
253d0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ss permissions.*
253e0 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20  * or a chroot() 
253f0 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20  might cause two 
25400 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
25410 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ses on the same.
25420 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65  ** database to e
25430 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66  nd up using diff
25440 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20  erent files for 
25450 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20  shared memory - 
25460 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  .** meaning that
25470 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f   their memory wo
25480 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  uld not really b
25490 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c  e shared - resul
254a0 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62  ting.** in datab
254b0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
254c0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74   Nevertheless, t
254d0 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75  his tmpfs file u
254e0 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65  sage.** can be e
254f0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
25500 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
25510 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
25520 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a  ORY="/dev/shm".*
25530 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c  * or the equival
25540 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ent.  The use of
25550 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   the SQLITE_SHM_
25560 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
25570 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e  e-time.** option
25580 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69   results in an i
25590 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c  ncompatible buil
255a0 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75  d of SQLite;  bu
255b0 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a  ilds of SQLite.*
255c0 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66  * that with diff
255d0 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d  ering SQLITE_SHM
255e0 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69  _DIRECTORY setti
255f0 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ngs attempt to u
25600 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64  se the.** same d
25610 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
25620 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
25630 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
25640 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  on will likely.*
25650 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51  * result. The SQ
25660 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
25670 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  RY compile-time 
25680 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64  option is consid
25690 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f  ered.** "unsuppo
256a0 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f  rted" and may go
256b0 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72   away in a futur
256c0 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  e SQLite release
256d0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
256e0 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
256f0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
25700 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
25710 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
25720 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
25730 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
25740 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
25750 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
25760 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
25770 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
25780 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
25790 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
257a0 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  ader cleared..**
257b0 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69  .** If the origi
257c0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
257d0 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69  e (pDbFd) is usi
257e0 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63  ng the "unix-exc
257f0 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d  l" VFS.** that m
25800 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63  eans that an exc
25810 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
25820 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
25830 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  ase file and.** 
25840 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
25850 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65  ocesses are able
25860 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
25870 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
25880 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65   In.** that case
25890 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c  , we do not real
258a0 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d  ly need shared m
258b0 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65  emory.  No share
258c0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65  d memory.** file
258d0 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
258e0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
258f0 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65  will be simulate
25900 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f  d with heap memo
25910 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
25920 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  t unixOpenShared
25930 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
25940 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
25950 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30  t unixShm *p = 0
25960 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
25970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
25980 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
25990 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
259a0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f  e *pShmNode;   /
259b0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
259c0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
259d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
259e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
259f0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
25a00 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
25a10 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
25a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
25a30 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63  ode of fd */.  c
25a40 68 61 72 20 2a 7a 53 68 6d 3b 20 20 20 20 20 20  har *zShm;      
25a50 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
25a60 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20  f the file used 
25a70 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74  for SHM */.  int
25a80 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20   nShmFilename;  
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25aa0 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20  Size of the SHM 
25ab0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65  filename in byte
25ac0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  s */..  /* Alloc
25ad0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
25ae0 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62  e new unixShm ob
25af0 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73  ject. */.  p = s
25b00 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
25b10 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
25b20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25b30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
25b40 42 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70  BKPT;.  memset(p
25b50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
25b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
25b70 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
25b80 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
25b90 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
25ba0 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
25bb0 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
25bc0 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
25bd0 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
25be0 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
25bf0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
25c00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 6e   */.  assert( un
25c10 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65  ixFileMutexNothe
25c20 6c 64 28 70 44 62 46 64 29 20 29 3b 0a 20 20 75  ld(pDbFd) );.  u
25c30 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
25c40 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  .  pInode = pDbF
25c50 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68  d->pInode;.  pSh
25c60 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  mNode = pInode->
25c70 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20  pShmNode;.  if( 
25c80 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
25c90 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
25ca0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
25cb0 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29        /* fstat()
25cc0 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61   info for databa
25cd0 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64  se file */.#ifnd
25ce0 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
25cf0 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73  RECTORY.    cons
25d00 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74  t char *zBasePat
25d10 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  h = pDbFd->zPath
25d20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
25d30 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
25d40 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
25d50 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
25d60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25d70 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
25d80 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
25d90 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
25da0 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
25db0 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
25dc0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
25dd0 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  me permissions..
25de0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
25df0 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c  sFstat(pDbFd->h,
25e00 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
25e10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25e20 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
25e30 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
25e40 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
25e50 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
25e60 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
25e70 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
25e80 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
25e90 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c  CTORY) + 31;.#el
25ea0 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
25eb0 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73  ame = 6 + (int)s
25ec0 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29  trlen(zBasePath)
25ed0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
25ee0 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  mNode = sqlite3_
25ef0 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
25f00 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
25f10 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
25f20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
25f30 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
25f40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
25f50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
25f60 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
25f70 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
25f80 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
25f90 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d  (*pShmNode)+nShm
25fa0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
25fb0 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  Shm = pShmNode->
25fc0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
25fd0 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b  r*)&pShmNode[1];
25fe0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
25ff0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
26000 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
26010 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
26020 7a 53 68 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  zShm, .         
26030 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
26040 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
26050 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78   "/sqlite-shm-%x
26060 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  -%x",.          
26070 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
26080 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75  sStat.st_ino, (u
26090 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29  32)sStat.st_dev)
260a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
260b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
260c0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c  mFilename, zShm,
260d0 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65   "%s-shm", zBase
260e0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
260f0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
26100 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
26110 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53  );.#endif.    pS
26120 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 20 3d 20 2d  hmNode->hShm = -
26130 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
26140 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
26150 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
26160 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
26170 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
26180 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
26190 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
261a0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
261b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d   pShmNode->pShmM
261c0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
261d0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
261e0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
261f0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
26200 65 2d 3e 70 53 68 6d 4d 75 74 65 78 3d 3d 30 20  e->pShmMutex==0 
26210 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26220 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
26230 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
26240 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
26250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
26260 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
26270 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
26280 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
26290 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
262a0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
262b0 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
262c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  ) ){.        pSh
262d0 6d 4e 6f 64 65 2d 3e 68 53 68 6d 20 3d 20 72 6f  mNode->hShm = ro
262e0 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20  bust_open(zShm, 
262f0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 28  O_RDWR|O_CREAT,(
26300 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
26310 37 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  77));.      }.  
26320 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
26330 2d 3e 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20  ->hShm<0 ){.    
26340 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53      pShmNode->hS
26350 68 6d 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  hm = robust_open
26360 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c  (zShm, O_RDONLY,
26370 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26   (sStat.st_mode&
26380 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 20 20  0777));.        
26390 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  if( pShmNode->hS
263a0 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hm<0 ){.        
263b0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
263c0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
263d0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
263e0 2c 20 7a 53 68 6d 29 3b 0a 20 20 20 20 20 20 20  , zShm);.       
263f0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
26400 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _err;.        }.
26410 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
26420 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31  ->isReadonly = 1
26430 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26440 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
26450 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
26460 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72  s root, make sur
26470 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20 66  e that the SHM f
26480 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ile.      ** is 
26490 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  owned by the sam
264a0 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73  e user that owns
264b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
264c0 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69  tabase.  Otherwi
264d0 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  se,.      ** the
264e0 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20   original owner 
264f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
26500 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20   to connect..   
26510 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
26520 73 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64  stFchown(pShmNod
26530 65 2d 3e 68 53 68 6d 2c 20 73 53 74 61 74 2e 73  e->hShm, sStat.s
26540 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f  t_uid, sStat.st_
26550 67 69 64 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  gid);..      rc 
26560 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
26570 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
26580 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  hmNode);.      i
26590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
265a0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
265b0 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
265c0 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
265d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _err;.    }.  }.
265e0 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
265f0 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
26600 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69  child of the uni
26610 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  xShmNode */.  p-
26620 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
26630 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
26640 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
26650 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
26660 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
26670 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
26680 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
26690 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c  Shm = p;.  unixL
266a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
266b0 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
266c0 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
266d0 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
266e0 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
266f0 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
26700 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78  over of the unix
26710 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
26720 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
26730 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
26740 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69   new (struct uni
26750 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  xShm) object to 
26760 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
26770 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
26780 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
26790 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
267a0 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
267b0 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
267c0 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
267d0 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
267e0 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
267f0 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
26800 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
26810 2a 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  * pShmNode->pShm
26820 4d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  Mutex..  */.  sq
26830 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
26840 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  r(pShmNode->pShm
26850 4d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  Mutex);.  p->pNe
26860 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
26870 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
26880 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
26890 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
268a0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70  eave(pShmNode->p
268b0 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ShmMutex);.  ret
268c0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
268d0 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
268e0 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
268f0 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
26900 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
26910 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
26920 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
26930 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
26940 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
26950 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
26960 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
26970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
26980 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26990 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
269a0 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
269b0 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
269c0 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
269d0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
269e0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
269f0 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
26a00 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
26a10 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
26a20 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
26a30 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
26a40 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
26a50 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
26a60 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
26a70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
26a80 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
26a90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
26aa0 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
26ab0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
26ac0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
26ad0 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
26ae0 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
26af0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
26b00 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
26b10 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
26b20 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
26b30 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
26b40 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
26b50 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
26b60 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
26b70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
26b80 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
26b90 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
26ba0 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
26bb0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
26bc0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
26bd0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
26be0 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
26bf0 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
26c00 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
26c10 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
26c20 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
26c30 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
26c40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26c50 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
26c60 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
26c70 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
26c80 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
26c90 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
26ca0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
26cb0 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
26cc0 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
26cd0 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
26ce0 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
26cf0 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
26d00 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
26d10 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
26d20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
26d30 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
26d40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d60 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
26d70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
26d80 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
26db0 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
26dc0 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26de0 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
26df0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
26e00 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
26e10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
26e20 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
26e30 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
26e40 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
26e50 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
26e60 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
26e70 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
26e80 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
26e90 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
26ea0 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
26eb0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
26ec0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
26ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
26ee0 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
26ef0 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
26f00 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71  ap();.  int nReq
26f10 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66  Region;..  /* If
26f20 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
26f30 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
26f40 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
26f50 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
26f60 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
26f70 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
26f80 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
26f90 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
26fa0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26fb0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26fc0 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
26fd0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
26fe0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
26ff0 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
27000 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
27010 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a  de->pShmMutex);.
27020 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
27030 69 73 55 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  isUnlocked ){.  
27040 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53    rc = unixLockS
27050 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
27060 64 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20  d, pShmNode);.  
27070 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27080 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  _OK ) goto shmpa
27090 67 65 5f 6f 75 74 3b 0a 20 20 20 20 70 53 68 6d  ge_out;.    pShm
270a0 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
270b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
270c0 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
270d0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
270e0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
270f0 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
27100 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
27110 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
27120 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
27130 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  t( pShmNode->hSh
27140 6d 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  m>=0 || pDbFd->p
27150 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
27160 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
27170 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  rt( pShmNode->hS
27180 68 6d 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  hm<0 || pDbFd->p
27190 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
271a0 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ock==0 );..  /* 
271b0 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Minimum number o
271c0 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72  f regions requir
271d0 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e  ed to be mapped.
271e0 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e   */.  nReqRegion
271f0 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68   = ((iRegion+nSh
27200 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50  mPerMap) / nShmP
27210 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72  erMap) * nShmPer
27220 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  Map;..  if( pShm
27230 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
27240 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
27250 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
27280 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
27290 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52    int nByte = nR
272a0 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  eqRegion*szRegio
272b0 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  n;   /* Minimum 
272c0 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
272d0 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
272e0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27300 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
27310 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
27320 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
27330 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
27340 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d  pShmNode->hShm>=
27350 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
27360 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
27370 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
27380 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
27390 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
273a0 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65  ce..      ** Che
273b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
273c0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
273d0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
273e0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
273f0 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  s.      ** large
27400 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
27410 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
27420 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20   region)..      
27430 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  */.      if( osF
27440 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
27450 53 68 6d 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  Shm, &sStat) ){.
27460 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27470 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
27480 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  E;.        goto 
27490 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
274a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
274b0 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c  ( sStat.st_size<
274c0 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
274d0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
274e0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
274f0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
27500 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65  If bExtend is se
27510 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
27520 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c  false, exit earl
27530 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
27540 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
27550 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
27560 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
27570 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65        if( !bExte
27580 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
27590 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
275a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
275b0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
275c0 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e  ively, if bExten
275d0 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e  d is true, exten
275e0 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74  d the file. Do t
275f0 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a  his by.        *
27600 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  * writing a sing
27610 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65  le byte to the e
27620 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20  nd of each (OS) 
27630 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20  page being.     
27640 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
27650 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63  or extended. Tec
27660 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65  hnically, we nee
27670 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20  d only write to 
27680 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  the.        ** l
27690 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65  ast page in orde
276a0 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  r to extend the 
276b0 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e  file. But writin
276c0 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20  g to all new.   
276d0 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f       ** pages fo
276e0 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61  rces the OS to a
276f0 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d  llocate them imm
27700 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20  ediately, which 
27710 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20  reduces.        
27720 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f  ** the chances o
27730 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61  f SIGBUS while a
27740 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70  ccessing the map
27750 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72  ped region later
27760 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a   on..        */.
27770 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20          else{.  
27780 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
27790 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
277a0 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20  4096;.          
277b0 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20  int iPg;..      
277c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
277d0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
277e0 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f   each newly allo
277f0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
27800 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
27810 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79      assert( (nBy
27820 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b  te % pgsz)==0 );
27830 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
27840 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a  Pg=(sStat.st_siz
27850 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42  e/pgsz); iPg<(nB
27860 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b  yte/pgsz); iPg++
27870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
27880 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
27890 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e        if( seekAn
278a0 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64  dWriteFd(pShmNod
278b0 65 2d 3e 68 53 68 6d 2c 20 69 50 67 2a 70 67 73  e->hShm, iPg*pgs
278c0 7a 20 2b 20 70 67 73 7a 2d 31 2c 22 22 2c 31 2c  z + pgsz-1,"",1,
278d0 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  &x)!=1 ){.      
278e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
278f0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d  ar *zFile = pShm
27900 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  Node->zFilename;
27910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
27920 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
27930 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
27940 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20  MSIZE, "write", 
27950 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
27960 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
27970 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
27980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27990 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
279a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
279b0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
279c0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
279d0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
279e0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
279f0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
27a00 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c  w = (char **)sql
27a10 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
27a20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27a30 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65  apRegion, nReqRe
27a40 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72  gion*sizeof(char
27a50 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   *).    );.    i
27a60 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
27a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
27a80 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
27a90 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
27aa0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
27ab0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
27ac0 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
27ad0 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
27ae0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71  de->nRegion<nReq
27af0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
27b00 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67  int nMap = szReg
27b10 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ion*nShmPerMap;.
27b20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
27b30 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
27b40 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
27b50 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20  e->hShm>=0 ){.  
27b60 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d        pMem = osM
27b70 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20  map(0, nMap,.   
27b80 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
27b90 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20  e->isReadonly ? 
27ba0 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54  PROT_READ : PROT
27bb0 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
27bc0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  , .            M
27bd0 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e  AP_SHARED, pShmN
27be0 6f 64 65 2d 3e 68 53 68 6d 2c 20 73 7a 52 65 67  ode->hShm, szReg
27bf0 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64  ion*(i64)pShmNod
27c00 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20  e->nRegion.     
27c10 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
27c20 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c  ( pMem==MAP_FAIL
27c30 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
27c40 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
27c50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
27c60 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70  HMMAP, "mmap", p
27c70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
27c80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
27c90 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
27ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27cc0 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
27cd0 61 6c 6c 6f 63 36 34 28 6e 4d 61 70 29 3b 0a 20  alloc64(nMap);. 
27ce0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
27cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27d00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27d10 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
27d20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
27d30 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
27d40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65        memset(pMe
27d50 6d 2c 20 30 2c 20 6e 4d 61 70 29 3b 0a 20 20 20  m, 0, nMap);.   
27d60 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
27d70 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61  i=0; i<nShmPerMa
27d80 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
27d90 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
27da0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
27db0 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68  egion+i] = &((ch
27dc0 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69  ar*)pMem)[szRegi
27dd0 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  on*i];.      }. 
27de0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
27df0 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65  Region += nShmPe
27e00 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rMap;.    }.  }.
27e10 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
27e20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
27e30 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
27e40 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
27e50 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
27e60 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
27e70 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
27e80 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
27e90 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
27ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
27eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
27ec0 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
27ed0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
27ee0 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29  Node->pShmMutex)
27ef0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27f00 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
27f10 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
27f20 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
27f30 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
27f40 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
27f50 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
27f60 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
27f70 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
27f80 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
27f90 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
27fa0 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
27fb0 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
27fc0 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
27fd0 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
27fe0 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
27ff0 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
28000 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
28010 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
28020 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
28030 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
28040 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
28050 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
28060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
28070 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
28080 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
28090 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
280a0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
280b0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
280c0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
280d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
280e0 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
280f0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
28100 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
28110 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
28120 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28130 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
28140 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
28150 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28170 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
28180 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
28190 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
281a0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
281b0 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
281c0 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
281d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
281e0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
281f0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
28200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28210 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
28220 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
28230 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28250 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
28260 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
28270 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
28280 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
28290 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
282a0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
282b0 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
282c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
282d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
282e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
282f0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
28300 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
28330 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
28340 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
28350 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
28360 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
28370 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
28380 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
28390 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
283a0 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
283b0 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
283c0 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
283d0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
283e0 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
283f0 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
28400 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
28410 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
28420 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
28430 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
28440 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
28450 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
28460 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
28470 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
28480 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
28490 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
284a0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
284b0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
284c0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
284d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
284e0 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
284f0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
28500 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
28510 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
28520 53 68 6d 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  Shm>=0 || pDbFd-
28530 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
28540 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
28550 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
28560 68 53 68 6d 3c 30 20 7c 7c 20 70 44 62 46 64 2d  hShm<0 || pDbFd-
28570 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
28580 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d  sLock==0 );..  m
28590 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
285a0 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
285b0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
285c0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
285d0 29 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) );..#ifdef SQL
285e0 49 54 45 5f 4d 55 54 45 58 46 52 45 45 5f 53 48  ITE_MUTEXFREE_SH
285f0 4d 4c 4f 43 4b 0a 20 20 69 66 28 20 70 44 62 46  MLOCK.  if( pDbF
28600 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
28610 65 73 73 4c 6f 63 6b 20 29 7b 0a 0a 20 20 20 20  essLock ){..    
28620 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
28630 20 20 75 36 34 20 6c 6f 63 6b 6d 61 73 6b 20 3d    u64 lockmask =
28640 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 6f 63 6b 6d   pShmNode->lockm
28650 61 73 6b 3b 0a 20 20 20 20 20 20 75 36 34 20 6e  ask;.      u64 n
28660 65 77 6d 61 73 6b 20 3d 20 6c 6f 63 6b 6d 61 73  ewmask = lockmas
28670 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  k;.      int i;.
28680 20 20 20 20 20 20 66 6f 72 28 69 3d 6f 66 73 74        for(i=ofst
28690 3b 20 69 3c 6e 2b 6f 66 73 74 3b 20 69 2b 2b 29  ; i<n+ofst; i++)
286a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 78  {.        int ix
286b0 38 20 3d 20 69 2a 38 3b 0a 20 20 20 20 20 20 20  8 = i*8;.       
286c0 20 75 38 20 76 20 3d 20 28 6c 6f 63 6b 6d 61 73   u8 v = (lockmas
286d0 6b 20 3e 3e 20 28 69 78 38 29 29 20 26 20 30 78  k >> (ix8)) & 0x
286e0 46 46 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  FF;.        if( 
286f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
28700 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
28710 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73         if( flags
28720 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
28730 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
28740 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78         if( p->ex
28750 63 6c 4d 61 73 6b 20 26 20 28 31 20 3c 3c 20 69  clMask & (1 << i
28760 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
28770 20 20 20 6e 65 77 6d 61 73 6b 20 3d 20 6e 65 77     newmask = new
28780 6d 61 73 6b 20 26 20 7e 28 28 75 36 34 29 30 78  mask & ~((u64)0x
28790 46 46 3c 3c 69 78 38 29 3b 0a 20 20 20 20 20 20  FF<<ix8);.      
287a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
287b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
287c0 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
287d0 65 64 4d 61 73 6b 20 26 20 28 31 20 3c 3c 20 69  edMask & (1 << i
287e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
287f0 20 20 20 6e 65 77 6d 61 73 6b 20 3d 20 6e 65 77     newmask = new
28800 6d 61 73 6b 20 26 20 7e 28 28 75 36 34 29 30 78  mask & ~((u64)0x
28810 46 46 3c 3c 69 78 38 29 20 7c 20 28 28 75 36 34  FF<<ix8) | ((u64
28820 29 28 76 2d 31 29 3c 3c 69 78 38 29 3b 0a 20 20  )(v-1)<<ix8);.  
28830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28860 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
28870 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
28880 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
28890 20 69 66 28 20 76 20 29 20 72 65 74 75 72 6e 20   if( v ) return 
288a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
288b0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d           if( (p-
288c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 31 20 3c  >exclMask & (1 <
288d0 3c 20 69 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  < i))==0 ){.    
288e0 20 20 20 20 20 20 20 20 20 20 6e 65 77 6d 61 73            newmas
288f0 6b 20 3d 20 6e 65 77 6d 61 73 6b 20 7c 20 28 28  k = newmask | ((
28900 75 36 34 29 30 78 46 46 3c 3c 69 78 38 29 3b 0a  u64)0xFF<<ix8);.
28910 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28930 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
28940 3d 3d 30 78 46 46 20 29 20 72 65 74 75 72 6e 20  ==0xFF ) return 
28950 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
28960 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d           if( (p-
28970 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 28 31  >sharedMask & (1
28980 20 3c 3c 20 69 29 29 3d 3d 30 20 29 7b 0a 20 20   << i))==0 ){.  
28990 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 6d              newm
289a0 61 73 6b 20 3d 20 6e 65 77 6d 61 73 6b 20 26 20  ask = newmask & 
289b0 7e 28 28 75 36 34 29 30 78 46 46 3c 3c 69 78 38  ~((u64)0xFF<<ix8
289c0 29 20 7c 20 28 28 75 36 34 29 28 76 2b 31 29 3c  ) | ((u64)(v+1)<
289d0 3c 69 78 38 29 3b 0a 20 20 20 20 20 20 20 20 20  <ix8);.         
289e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
289f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28a00 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 75 6e   }..      if( un
28a10 69 78 43 6f 6d 70 61 72 65 41 6e 64 53 77 61 70  ixCompareAndSwap
28a20 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 6c 6f 63 6b  (&pShmNode->lock
28a30 6d 61 73 6b 2c 20 6c 6f 63 6b 6d 61 73 6b 2c 20  mask, lockmask, 
28a40 6e 65 77 6d 61 73 6b 29 20 29 20 62 72 65 61 6b  newmask) ) break
28a50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
28a60 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
28a70 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
28a80 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
28a90 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
28aa0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
28ab0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
28ac0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
28ad0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
28ae0 56 45 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  VE ){.      p->e
28af0 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
28b00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28b10 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
28b20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  |= mask;.    }..
28b30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28b40 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  E_OK;.  }.#endif
28b50 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
28b60 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
28b70 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20  ->pShmMutex);.  
28b80 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
28b90 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
28ba0 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
28bb0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
28bc0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
28bd0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
28be0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
28bf0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
28c00 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
28c10 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
28c20 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
28c30 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
28c40 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
28c50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28c60 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
28c70 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
28c80 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
28c90 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
28ca0 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
28cb0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
28cc0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
28cd0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
28ce0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
28cf0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
28d00 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
28d10 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
28d20 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
28d30 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
28d40 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
28d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28d70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
28d80 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
28d90 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
28da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28db0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
28dc0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
28dd0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
28de0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
28df0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
28e00 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
28e10 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
28e20 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
28e30 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
28e40 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
28e50 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
28e60 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
28e70 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
28e80 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
28e90 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
28ea0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
28eb0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
28ec0 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
28ed0 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
28ee0 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
28ef0 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
28f00 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
28f10 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
28f20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
28f30 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
28f40 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
28f50 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
28f60 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
28f70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
28f80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
28f90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28fa0 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
28fb0 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
28fc0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
28fd0 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
28fe0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
28ff0 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
29000 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
29010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29020 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
29030 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
29040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
29050 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
29060 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44  Lock(pDbFd, F_RD
29070 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
29080 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
29090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
290a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
290b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
290c0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
290d0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
290e0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
290f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29100 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
29110 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
29120 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
29130 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
29140 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
29150 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
29160 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
29170 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
29180 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
29190 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
291a0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
291b0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
291c0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
291d0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
291e0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
291f0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
29200 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
29210 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
29220 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
29230 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
29240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29250 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
29260 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
29270 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
29280 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
29290 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
292a0 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
292b0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
292c0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
292d0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
292e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
292f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29300 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
29310 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
29320 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  d, F_WRLCK, ofst
29330 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
29340 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
29350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29360 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
29370 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
29380 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
29390 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
293a0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
293b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
293c0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
293d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d  (pShmNode->pShmM
293e0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
293f0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
29400 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
29410 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
29420 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
29430 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d   osGetpid(0), p-
29440 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
29450 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
29460 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29470 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
29480 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
29490 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
294a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
294b0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
294c0 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
294d0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
294e0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
294f0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
29500 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
29510 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
29520 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
29530 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
29540 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
29550 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
29560 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29570 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
29580 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
29590 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
295a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
295b0 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
295c0 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20  yBarrier();     
295d0 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d      /* compiler-
295e0 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62  defined memory b
295f0 61 72 72 69 65 72 20 2a 2f 0a 20 20 61 73 73 65  arrier */.  asse
29600 72 74 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  rt( fd->pMethods
29610 2d 3e 78 4c 6f 63 6b 3d 3d 6e 6f 6c 6f 63 6b 4c  ->xLock==nolockL
29620 6f 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c 20 75  ock .       || u
29630 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68  nixFileMutexNoth
29640 65 6c 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 66  eld((unixFile*)f
29650 64 29 20 0a 20 20 29 3b 0a 20 20 75 6e 69 78 45  d) .  );.  unixE
29660 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20  nterMutex();    
29670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
29680 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65  so mutex, for re
29690 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e  dundancy */.  un
296a0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
296b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
296c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
296d0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
296e0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
296f0 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
29700 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
29710 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
29720 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61   there is no sha
29730 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
29740 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
29750 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74  onnection then t
29760 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
29770 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
29780 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
29790 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a  t unixShmUnmap(.
297a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
297b0 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
297c0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
297d0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
297e0 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
297f0 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
29800 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
29810 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
29820 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  f true */.){.  u
29830 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  nixShm *p;      
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29850 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
29860 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
29870 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
29880 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
29890 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
298a0 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
298b0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
298c0 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
298e0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
298f0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
29900 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
29910 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
29920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29930 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
29940 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
29950 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
29960 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
29970 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
29980 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
29990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
299a0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
299b0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
299c0 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
299d0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
299e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
299f0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
29a00 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
29a10 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
29a20 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
29a30 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
29a40 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
29a50 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
29a60 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
29a70 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
29a80 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
29a90 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
29aa0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
29ab0 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
29ac0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
29ad0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
29ae0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
29af0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
29b00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
29b10 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
29b20 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
29b30 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
29b40 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29  Node->pShmMutex)
29b50 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
29b60 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
29b70 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
29b80 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
29b90 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
29ba0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
29bb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  */.  assert( uni
29bc0 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
29bd0 64 28 70 44 62 46 64 29 20 29 3b 0a 20 20 75 6e  d(pDbFd) );.  un
29be0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
29bf0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
29c00 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
29c10 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
29c20 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
29c30 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
29c40 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
29c50 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  && pShmNode->hSh
29c60 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  m>=0 ){.      os
29c70 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
29c80 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
29c90 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75   }.    unixShmPu
29ca0 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
29cb0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
29cc0 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
29cd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
29ce0 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
29cf0 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
29d00 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
29d10 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
29d20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
29d30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
29d40 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
29d50 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
29d60 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
29d70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
29d80 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
29d90 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
29da0 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
29db0 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
29dc0 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
29dd0 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
29de0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
29df0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
29e00 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
29e10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
29e20 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 69  ARED_MAPPING.  i
29e30 66 28 20 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  f( pFd->pInode )
29e40 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
29e50 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
29e60 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
29e70 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
29e80 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
29e90 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
29ea0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
29eb0 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
29ec0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
29ed0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
29ee0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
29ef0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
29f00 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
29f10 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
29f20 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
29f30 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
29f40 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
29f50 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
29f60 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
29f70 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
29f80 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
29f90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
29fa0 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
29fb0 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
29fc0 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
29fd0 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
29fe0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
29ff0 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
2a000 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
2a010 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
2a020 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
2a030 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2a040 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
2a050 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
2a060 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
2a070 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
2a080 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
2a090 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
2a0a0 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
2a0b0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
2a0c0 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
2a0d0 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
2a0e0 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
2a0f0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
2a100 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
2a110 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
2a120 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2a130 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2a140 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
2a150 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
2a180 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
2a190 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2a1a0 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
2a1b0 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2a1e0 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
2a1f0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
2a200 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
2a210 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
2a220 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2a230 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
2a240 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
2a250 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
2a260 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
2a270 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
2a280 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
2a290 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
2a2a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2a2c0 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
2a2d0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
2a2e0 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
2a2f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a300 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
2a310 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
2a320 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
2a330 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
2a340 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
2a350 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
2a360 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
2a370 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
2a380 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
2a390 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2a3a0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
2a3b0 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
2a3c0 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
2a3d0 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
2a3e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2a3f0 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
2a400 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
2a410 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2a420 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
2a430 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
2a440 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
2a450 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56  pOrig ){.#if HAV
2a460 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34  E_MREMAP.    i64
2a470 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d   nReuse = pFd->m
2a480 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20  mapSize;.#else. 
2a490 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
2a4a0 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61  yspage = osGetpa
2a4b0 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
2a4c0 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
2a4d0 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
2a4e0 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e  Syspage-1));.#en
2a4f0 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71  dif.    u8 *pReq
2a500 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
2a510 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
2a520 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
2a530 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
2a540 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
2a550 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
2a560 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
2a570 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
2a580 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
2a590 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
2a5a0 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
2a5b0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
2a5c0 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
2a5d0 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
2a5e0 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
2a5f0 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
2a600 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
2a610 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
2a620 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
2a630 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
2a640 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
2a650 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
2a660 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
2a670 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
2a680 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
2a690 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
2a6a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
2a6b0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
2a6c0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
2a6d0 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
2a6e0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
2a6f0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
2a700 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
2a710 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
2a720 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
2a730 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
2a740 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
2a750 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
2a760 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
2a770 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
2a780 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
2a790 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
2a7a0 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
2a7b0 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
2a7c0 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
2a7d0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
2a7e0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
2a7f0 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
2a800 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
2a810 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
2a820 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
2a830 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
2a840 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
2a850 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
2a860 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
2a870 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
2a880 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
2a890 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
2a8a0 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
2a8b0 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
2a8c0 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
2a8d0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
2a8e0 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
2a8f0 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
2a900 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
2a910 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
2a920 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
2a930 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
2a940 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
2a950 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
2a960 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
2a970 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
2a980 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2a990 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
2a9a0 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
2a9b0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
2a9c0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
2a9d0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
2a9e0 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
2a9f0 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
2aa00 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
2aa10 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
2aa20 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
2aa30 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
2aa40 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
2aa50 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
2aa60 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
2aa70 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
2aa80 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
2aa90 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
2aaa0 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
2aab0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2aac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
2aad0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
2aae0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
2aaf0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
2ab00 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
2ab10 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
2ab20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
2ab30 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
2ab40 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
2ab50 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
2ab60 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
2ab70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
2ab80 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
2ab90 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
2aba0 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
2abb0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
2abc0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
2abd0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
2abe0 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
2abf0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
2ac00 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
2ac10 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
2ac20 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
2ac30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2ac40 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
2ac50 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
2ac60 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
2ac70 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
2ac80 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
2ac90 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
2aca0 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
2acb0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
2acc0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
2acd0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
2ace0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
2acf0 2c 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61  , i64 nMap){.  a
2ad00 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
2ad10 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
2ad20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2ad30 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d   nMap>0 || (pFd-
2ad40 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20  >mmapSize==0 && 
2ad50 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
2ad60 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64  =0) );.  if( pFd
2ad70 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
2ad80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ad90 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
2ada0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
2adb0 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
2adc0 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
2add0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
2ade0 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73  on */.    if( os
2adf0 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
2ae00 74 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20  tatbuf) ){.     
2ae10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ae20 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
2ae30 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61  }.    nMap = sta
2ae40 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20  tbuf.st_size;.  
2ae50 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
2ae60 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
2ae70 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
2ae80 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
2ae90 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2aea0 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a  _SHARED_MAPPING.
2aeb0 20 20 69 66 28 20 70 46 64 2d 3e 70 49 6e 6f 64    if( pFd->pInod
2aec0 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  e ){.    unixIno
2aed0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
2aee0 20 70 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20   pFd->pInode;.  
2aef0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
2af00 65 67 69 6f 6e 20 29 20 72 65 74 75 72 6e 20 53  egion ) return S
2af10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 75 6e  QLITE_OK;.    un
2af20 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2af30 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
2af40 70 53 68 61 72 65 64 4d 61 70 70 69 6e 67 3d 3d  pSharedMapping==
2af50 30 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  0 ){.      u8 *p
2af60 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  New = osMmap(0, 
2af70 6e 4d 61 70 2c 20 50 52 4f 54 5f 52 45 41 44 2c  nMap, PROT_READ,
2af80 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 46 64   MAP_SHARED, pFd
2af90 2d 3e 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ->h, 0);.      i
2afa0 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49  f( pNew==MAP_FAI
2afb0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 75  LED ){.        u
2afc0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2afd0 54 45 5f 4f 4b 2c 20 22 6d 6d 61 70 22 2c 20 70  TE_OK, "mmap", p
2afe0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
2aff0 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
2b000 65 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  eMax = 0;.      
2b010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2b020 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d 61  Inode->pSharedMa
2b030 70 70 69 6e 67 20 3d 20 70 4e 65 77 3b 0a 20 20  pping = pNew;.  
2b040 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
2b050 68 61 72 65 64 4d 61 70 70 69 6e 67 20 3d 20 6e  haredMapping = n
2b060 4d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Map;.      }.   
2b070 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70   }.    pFd->pMap
2b080 52 65 67 69 6f 6e 20 3d 20 70 49 6e 6f 64 65 2d  Region = pInode-
2b090 3e 70 53 68 61 72 65 64 4d 61 70 70 69 6e 67 3b  >pSharedMapping;
2b0a0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
2b0b0 7a 65 41 63 74 75 61 6c 20 3d 20 70 46 64 2d 3e  zeActual = pFd->
2b0c0 6d 6d 61 70 53 69 7a 65 20 3d 20 70 49 6e 6f 64  mmapSize = pInod
2b0d0 65 2d 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e  e->nSharedMappin
2b0e0 67 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  g;.    unixLeave
2b0f0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
2b100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b110 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
2b120 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28  ert( nMap>0 || (
2b130 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30  pFd->mmapSize==0
2b140 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67   && pFd->pMapReg
2b150 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ion==0) );.  if(
2b160 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
2b170 53 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78  Size ){.    unix
2b180 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e  Remapfile(pFd, n
2b190 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Map);.  }..  ret
2b1a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b1b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2b1c0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2b1d0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  0 */../*.** If p
2b1e0 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20  ossible, return 
2b1f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d  a pointer to a m
2b200 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66  apping of file f
2b210 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66  d starting at of
2b220 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68  fset.** iOff. Th
2b230 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62  e mapping must b
2b240 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c  e valid for at l
2b250 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e  east nAmt bytes.
2b260 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
2b270 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20   pointer can be 
2b280 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20  obtained, store 
2b290 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65  it in *pp and re
2b2a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
2b2b0 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61  ** Or, if one ca
2b2c0 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f  nnot but no erro
2b2d0 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70  r occurs, set *p
2b2e0 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  p to 0 and retur
2b2f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
2b300 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  Finally, if an e
2b310 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
2b320 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
2b330 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
2b340 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  e final.** value
2b350 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66   of *pp is undef
2b360 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
2b370 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e..**.** If this
2b380 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72   function does r
2b390 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c  eturn a pointer,
2b3a0 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
2b3b0 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20   eventually .** 
2b3c0 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
2b3d0 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
2b3e0 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a   unixUnfetch()..
2b3f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2b400 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  ixFetch(sqlite3_
2b410 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
2b420 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
2b430 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51  id **pp){.#if SQ
2b440 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2b450 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20  ZE>0.  unixFile 
2b460 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
2b470 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20   *)fd;   /* The 
2b480 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
2b490 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  ase file */.#end
2b4a0 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23  if.  *pp = 0;..#
2b4b0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2b4c0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
2b4d0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
2b4e0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
2b4f0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
2b500 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2b510 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
2b520 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69  Fd, -1);.      i
2b530 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b540 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2b550 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
2b560 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
2b570 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
2b580 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
2b590 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
2b5a0 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
2b5b0 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
2b5c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2b5d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b5e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
2b5f0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2b600 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
2b610 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2b620 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a  n releases a .**
2b630 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
2b640 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
2b650 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65  r call to unixFe
2b660 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e  tch(). The secon
2b670 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61  d.** argument pa
2b680 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2b690 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68  ction must be th
2b6a0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f  e same as the co
2b6b0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61  rresponding.** a
2b6c0 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73  rgument that was
2b6d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75   passed to the u
2b6e0 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63  nixFetch() invoc
2b6f0 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72  ation. .**.** Or
2b700 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61  , if the third a
2b710 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  rgument is NULL,
2b720 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2b730 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
2b740 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72  led .** to infor
2b750 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  m the VFS layer 
2b760 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20  that, according 
2b770 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78  to POSIX, any ex
2b780 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a  isting mapping .
2b790 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
2b7a0 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
2b7b0 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
2b7c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b7d0 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
2b7e0 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
2b7f0 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69  ff, void *p){.#i
2b800 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
2b810 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
2b820 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
2b830 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
2b840 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
2b850 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2b860 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b870 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20  ER(iOff);..  /* 
2b880 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74  If p==0 (unmap t
2b890 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20  he entire file) 
2b8a0 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
2b8b0 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
2b8c0 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72  g .  ** xFetch r
2b8d0 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69  eferences. Or, i
2b8e0 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20  f p!=0 (meaning 
2b8f0 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20  it is an xFetch 
2b900 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a  reference),.  **
2b910 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
2b920 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
2b930 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a   outstanding.  *
2b940 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d  /.  assert( (p==
2b950 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68  0)==(pFd->nFetch
2b960 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Out==0) );..  /*
2b970 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73   If p!=0, it mus
2b980 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66  t match the iOff
2b990 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73   value. */.  ass
2b9a0 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d  ert( p==0 || p==
2b9b0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
2b9c0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29  pRegion)[iOff] )
2b9d0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
2b9e0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
2b9f0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
2ba00 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
2ba10 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
2ba20 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
2ba30 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20  ut>=0 );.#else. 
2ba40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ba50 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
2ba60 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
2ba70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ba80 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  (iOff);.#endif. 
2ba90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2baa0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
2bab0 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
2bac0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
2bad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
2bae0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
2baf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2bb00 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
2bb10 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
2bb20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb30 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2bb40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb80 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
2bb90 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
2bba0 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
2bbb0 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
2bbc0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
2bbd0 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
2bbe0 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
2bbf0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
2bc00 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
2bc10 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
2bc20 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
2bc30 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
2bc40 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
2bc50 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
2bc60 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2bc70 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
2bc80 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
2bc90 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
2bca0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
2bcb0 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
2bcc0 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
2bcd0 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
2bce0 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
2bcf0 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
2bd00 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
2bd10 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
2bd20 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
2bd30 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
2bd40 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
2bd50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2bd60 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
2bd70 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2bd80 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
2bd90 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
2bda0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
2bdb0 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
2bdc0 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
2bdd0 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
2bde0 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
2bdf0 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
2be00 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
2be10 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
2be20 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
2be30 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46  inder-function F
2be40 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72  , two objects ar
2be50 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  e created:.**.**
2be60 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c      (1) The real
2be70 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2be80 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22   named "FImpt()"
2be90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41  ..**.**    (2) A
2bea0 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65   constant pointe
2beb0 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  r to this functi
2bec0 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46  on named just "F
2bed0 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  "..**.**.** A po
2bee0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70  inter to the F p
2bef0 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61  ointer is used a
2bf00 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76  s the pAppData v
2bf10 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20  alue for VFS.** 
2bf20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76  objects.  We hav
2bf30 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73  e to do this ins
2bf40 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20  tead of letting 
2bf50 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a  pAppData point.*
2bf60 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68  * directly at th
2bf70 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
2bf80 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65  n since C90 rule
2bf90 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64  s prevent a void
2bfa0 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73  *.** from be cas
2bfb0 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f  t into a functio
2bfc0 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  n pointer..**.**
2bfd0 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63  .** Each instanc
2bfe0 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20  e of this macro 
2bff0 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62  generates two ob
2c000 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  jects:.**.**   *
2c010 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c    A constant sql
2c020 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c030 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48  object call METH
2c040 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  OD that has lock
2c050 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68  ing.**      meth
2c060 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ods CLOSE, LOCK,
2c070 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f   UNLOCK, CKRESLO
2c080 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  CK..**.**   *  A
2c090 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e  n I/O method fin
2c0a0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  der function cal
2c0b0 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20  led FINDER that 
2c0c0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
2c0d0 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  r.**      to the
2c0e0 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69   METHOD object i
2c0f0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  n the previous b
2c100 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ullet..*/.#defin
2c110 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44  e IOMETHODS(FIND
2c120 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f  ER,METHOD,VERSIO
2c130 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c  N,CLOSE,LOCK,UNL
2c140 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41  OCK,CKLOCK,SHMMA
2c150 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20  P)     \.static 
2c160 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2c170 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20  _methods METHOD 
2c180 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  = {             
2c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1a0 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49        \.   VERSI
2c1b0 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ON,             
2c1c0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2c1d0 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
2c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1f0 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c       \.   CLOSE,
2c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c210 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2c220 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61      \.   unixRea
2c250 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2c260 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
2c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74     \.   unixWrit
2c2a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c2b0 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
2c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2e0 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63    \.   unixTrunc
2c2f0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
2c300 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
2c310 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c330 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20   \.   unixSync, 
2c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c350 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20    /* xSync */   
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c380 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  \.   unixFileSiz
2c390 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c3a0 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
2c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2c3d0 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20  .   LOCK,       
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3f0 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  /* xLock */     
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2c420 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20     UNLOCK,      
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c440 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20  * xUnlock */    
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2c470 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20    CKLOCK,       
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c490 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2c4a0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2c4c0 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
2c4d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c4e0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20  xFileControl */ 
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c500 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2c510 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20  unixSectorSize, 
2c520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c530 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20  SectorSize */   
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c550 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2c560 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
2c570 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
2c580 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65  eviceCapabilitie
2c590 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
2c5a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48           \.   SH
2c5b0 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20  MMAP,           
2c5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2c5d0 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  mMap */         
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2c600 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  xShmLock,       
2c610 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2c620 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c640 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2c650 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
2c660 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
2c670 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20  arrier */       
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c690 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
2c6a0 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
2c6b0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
2c6c0 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  map */          
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6e0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65       \.   unixFe
2c6f0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
2c700 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
2c710 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66      \.   unixUnf
2c740 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
2c750 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68       /* xUnfetch
2c760 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20     \.};         
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7d0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
2c7e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c7f0 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70  ods *FINDER##Imp
2c800 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  l(const char *z,
2c810 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20   unixFile *p){  
2c820 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   \.  UNUSED_PARA
2c830 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44  METER(z); UNUSED
2c840 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20  _PARAMETER(p);  
2c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c870 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48  \.  return &METH
2c880 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OD;             
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2c8c0 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .}              
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2c910 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2c920 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c930 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29  *(*const FINDER)
2c940 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2c950 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20  xFile *p)    \. 
2c960 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70     = FINDER##Imp
2c970 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61  l;../*.** Here a
2c980 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71  re all of the sq
2c990 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2c9a0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
2c9b0 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  h of the.** lock
2c9c0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
2c9d0 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   Functions that 
2c9e0 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20  return pointers 
2c9f0 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  to these methods
2ca00 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65  .** are also cre
2ca10 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f  ated..*/.IOMETHO
2ca20 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e  DS(.  posixIoFin
2ca30 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2ca40 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
2ca50 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73  on name */.  pos
2ca60 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ixIoMethods,    
2ca70 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2ca80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2ca90 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c  ect name */.  3,
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cab0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
2cac0 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61  d memory and mma
2cad0 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f  p are enabled */
2cae0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb00 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2cb10 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb30 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2cb40 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2cb60 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2cb70 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
2cb80 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  rvedLock,    /* 
2cb90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2cba0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
2cbb0 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20  nixShmMap       
2cbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2cbd0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2cbe0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
2cbf0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
2cc00 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2cc10 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2cc20 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
2cc30 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
2cc40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2cc50 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2cc60 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20  */.  3,         
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cc80 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2cc90 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61  and mmap are ena
2cca0 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  bled */.  nolock
2ccb0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2ccc0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2ccd0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
2cce0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2ccf0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2cd00 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
2cd10 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2cd20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2cd30 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
2cd40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2cd50 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k,  /* xCheckRes
2cd60 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2cd70 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd90 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2cda0 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
2cdb0 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
2cdc0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
2cdd0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2cde0 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
2cdf0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2ce00 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2ce10 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2ce20 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce40 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2ce50 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2ce60 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
2ce70 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2ce80 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2ce90 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
2cea0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2ceb0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2cec0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
2ced0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2cee0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2cef0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
2cf00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2cf10 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72  , /* xCheckReser
2cf20 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2cf30 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cf50 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2cf60 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
2cf70 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2cf80 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
2cf90 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
2cfa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2cfb0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2cfc0 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
2cfd0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2cfe0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2cff0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2d000 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2d030 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2d040 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
2d050 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2d060 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2d070 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
2d080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d090 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2d0a0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
2d0b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2d0c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2d0d0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
2d0e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2d0f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2d100 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2d110 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2d120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d130 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2d140 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2d150 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
2d160 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e  HODS(.  semIoFin
2d170 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2d180 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2d190 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73  tion name */.  s
2d1a0 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  emIoMethods,    
2d1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2d1c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2d1d0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2d1e0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2d1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2d200 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
2d210 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58  sabled */.  semX
2d220 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2d230 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2d240 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58  method */.  semX
2d250 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2d260 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2d270 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55  ethod */.  semXU
2d280 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2d290 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2d2a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58  method */.  semX
2d2b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2d2c0 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k,    /* xCheckR
2d2d0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2d2e0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d300 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2d310 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2d320 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2d330 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2d340 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d350 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2d360 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c  (.  afpIoFinder,
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d380 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2d390 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f   name */.  afpIo
2d3a0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2d3b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2d3c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2d3d0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2d400 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2d410 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65  ed */.  afpClose
2d420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d430 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2d440 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c  od */.  afpLock,
2d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d460 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2d470 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b  d */.  afpUnlock
2d480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d490 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2d4a0 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b  od */.  afpCheck
2d4b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2d4c0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2d4d0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2d4e0 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d500 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2d510 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
2d520 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
2d530 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
2d540 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
2d550 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
2d560 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
2d570 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
2d580 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
2d590 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
2d5a0 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
2d5b0 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
2d5c0 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
2d5d0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
2d5e0 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
2d5f0 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
2d600 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
2d610 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
2d620 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
2d630 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
2d640 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
2d650 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
2d660 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
2d670 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
2d680 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
2d690 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
2d6a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
2d6b0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
2d6c0 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
2d6d0 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
2d6e0 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
2d6f0 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
2d700 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
2d710 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2d720 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2d730 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
2d740 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
2d750 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
2d760 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
2d770 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
2d780 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
2d790 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
2d7a0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
2d7b0 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
2d7c0 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
2d7d0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
2d7e0 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a  3_file*, int*);.
2d7f0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
2d800 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
2d810 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2d820 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2d830 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
2d840 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
2d850 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2d860 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2d870 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d890 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2d8a0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2d8b0 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
2d8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2d8d0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2d8e0 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
2d8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2d900 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2d910 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
2d920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2d930 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2d940 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
2d950 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43  vedLock,   /* xC
2d960 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2d970 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2d9a0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
2d9b0 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
2d9c0 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
2d9d0 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
2d9e0 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
2d9f0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
2da00 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
2da10 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2da20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2da30 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
2da40 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
2da50 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2da60 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2da70 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2da80 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
2da90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
2daa0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2dab0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2dac0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dae0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2daf0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
2db00 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
2db10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2db20 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2db30 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
2db40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2db50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2db60 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
2db70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2db80 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2db90 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
2dba0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
2dbb0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2dbc0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2dbf0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2dc00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2dc10 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2dc20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2dc30 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
2dc40 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
2dc50 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
2dc60 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
2dc70 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
2dc80 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
2dc90 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2dca0 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
2dcb0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
2dcc0 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
2dcd0 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
2dce0 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
2dcf0 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
2dd00 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
2dd10 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
2dd20 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
2dd30 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2dd40 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
2dd50 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
2dd60 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
2dd70 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
2dd80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2dd90 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
2dda0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
2ddb0 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
2ddc0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
2ddd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2dde0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2ddf0 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
2de00 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
2de10 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2de30 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
2de40 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
2de50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2de60 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
2de70 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
2de80 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
2de90 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
2dea0 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
2deb0 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
2dec0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
2ded0 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
2dee0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
2def0 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
2df00 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2df10 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
2df20 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2df30 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
2df40 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
2df50 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
2df60 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
2df70 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
2df80 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
2df90 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
2dfa0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
2dfb0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
2dfc0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
2dfd0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
2dfe0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
2dff0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
2e000 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
2e010 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
2e020 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
2e030 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2e040 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
2e050 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
2e060 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
2e070 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
2e080 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
2e090 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e0a0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2e0b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
2e0c0 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
2e0d0 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
2e0e0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2e0f0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
2e100 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
2e110 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
2e120 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e130 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
2e140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e150 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
2e160 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
2e170 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
2e180 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
2e190 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
2e1a0 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
2e1b0 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
2e1c0 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
2e1d0 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
2e1e0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
2e1f0 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
2e200 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
2e210 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
2e220 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
2e230 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
2e240 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
2e250 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
2e260 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
2e270 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
2e280 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
2e290 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
2e2a0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28  !=-1 ) {.    if(
2e2b0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
2e2c0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66  _fstypename, "nf
2e2d0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
2e2e0 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74  return &nfsIoMet
2e2f0 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65  hods;.    } else
2e300 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2e310 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2e320 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2e330 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c      return &dotl
2e340 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2e350 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
2e360 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2e370 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
2e380 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2e390 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2e3a0 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
2e3b0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
2e3c0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
2e3d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2e3e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2e3f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
2e400 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2e410 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  ./*.** This "fin
2e420 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f  der" function fo
2e430 72 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73  r VxWorks checks
2e440 20 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78   to see if posix
2e450 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63   advisory.** loc
2e460 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20  king works.  If 
2e470 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68  it does, then th
2e480 61 74 20 69 73 20 77 68 61 74 20 69 73 20 75 73  at is what is us
2e490 65 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  ed.  If it does 
2e4a0 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65  not.** work, the
2e4b0 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61  n fallback to na
2e4c0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
2e4d0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
2e4e0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2e4f0 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72  o_methods *vxwor
2e500 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ksIoFinderImpl(.
2e510 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2e520 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2e530 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2e540 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2e550 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2e560 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65        /* the ope
2e570 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  n file object */
2e580 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
2e590 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2e5a0 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2e5b0 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2e5c0 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2e5d0 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2e5e0 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2e5f0 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2e600 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2e610 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2e620 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2e630 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2e640 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  ;.  }..  /* Test
2e650 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73   if fcntl() is s
2e660 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65  upported and use
2e670 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
2e680 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  ks..  ** Otherwi
2e690 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  se fall back to 
2e6a0 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
2e6b0 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f  ore method..  */
2e6c0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
2e6d0 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
2e6e0 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
2e6f0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
2e700 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
2e710 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
2e720 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
2e730 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
2e740 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
2e750 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
2e760 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2e770 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
2e780 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
2e790 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  semIoMethods;.  
2e7a0 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
2e7b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2e7c0 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
2e7d0 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29  vxworksIoFinder)
2e7e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2e7f0 78 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b  xFile*) = vxwork
2e800 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  sIoFinderImpl;..
2e810 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
2e820 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ORKS */../*.** A
2e830 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
2e840 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
2e850 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69   an IO method fi
2e860 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a  nder function:.*
2e870 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20  /.typedef const 
2e880 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2e890 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70  ds *(*finder_typ
2e8a0 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  e)(const char*,u
2e8b0 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a  nixFile*);.../**
2e8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2e910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e920 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
2e930 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
2e940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e950 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
2e960 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
2e970 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
2e980 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
2e990 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
2e9a0 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
2e9b0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ..*/../*.** Init
2e9c0 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65  ialize the conte
2e9d0 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  nts of the unixF
2e9e0 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  ile structure po
2e9f0 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e  inted to by pId.
2ea00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2ea10 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20  illInUnixFile(. 
2ea20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2ea30 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  fs,      /* Poin
2ea40 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
2ea50 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  t */.  int h,   
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ea70 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
2ea80 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
2ea90 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
2eaa0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2eab0 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74  Id,      /* Writ
2eac0 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
2ead0 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
2eae0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2eaf0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
2eb00 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
2eb10 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2eb20 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67  /.  int ctrlFlag
2eb30 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a  s           /* Z
2eb40 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58  ero or more UNIX
2eb50 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  FILE_* values */
2eb60 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  .){.  const sqli
2eb70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2eb80 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2eb90 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
2eba0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
2ebb0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
2ebc0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2ebd0 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  rt( pNew->pInode
2ebe0 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
2ebf0 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72  No locking occur
2ec00 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  s in temporary f
2ec10 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
2ec20 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c  ( zFilename!=0 |
2ec30 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  | (ctrlFlags & U
2ec40 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21  NIXFILE_NOLOCK)!
2ec50 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
2ec60 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  (("OPEN    %-3d 
2ec70 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  %s\n", h, zFilen
2ec80 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68  ame));.  pNew->h
2ec90 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56   = h;.  pNew->pV
2eca0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65  fs = pVfs;.  pNe
2ecb0 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
2ecc0 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74  name;.  pNew->ct
2ecd0 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74  rlFlags = (u8)ct
2ece0 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c  rlFlags;.#if SQL
2ecf0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
2ed00 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70  E>0.  pNew->mmap
2ed10 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
2ed20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
2ed30 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Mmap;.#endif.  i
2ed40 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
2ed50 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61  oolean(((ctrlFla
2ed60 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52  gs & UNIXFILE_UR
2ed70 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a  I) ? zFilename :
2ed80 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eda0 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
2edb0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2edc0 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  TE) ){.    pNew-
2edd0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2ede0 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  IXFILE_PSOW;.  }
2edf0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 56  .  if( strcmp(pV
2ee00 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d  fs->zName,"unix-
2ee10 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  excl")==0 ){.   
2ee20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2ee30 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43   |= UNIXFILE_EXC
2ee40 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  L;.  }..#if OS_V
2ee50 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70  XWORKS.  pNew->p
2ee60 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64  Id = vxworksFind
2ee70 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65  FileId(zFilename
2ee80 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70  );.  if( pNew->p
2ee90 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72  Id==0 ){.    ctr
2eea0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2eeb0 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72  LE_NOLOCK;.    r
2eec0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2eed0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
2eee0 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61  f..  if( ctrlFla
2eef0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2ef00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  LOCK ){.    pLoc
2ef10 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
2ef20 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2ef30 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
2ef40 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
2ef50 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
2ef60 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
2ef70 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
2ef80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ef90 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2efa0 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
2efb0 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
2efc0 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
2efd0 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
2efe0 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
2eff0 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
2f000 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
2f010 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
2f020 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
2f030 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
2f040 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
2f050 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
2f060 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
2f070 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
2f080 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2f090 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
2f0a0 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
2f0b0 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
2f0c0 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
2f0d0 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
2f0e0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2f0f0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2f100 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2f110 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
2f120 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
2f130 68 6f 64 73 0a 23 65 6e 64 69 66 0a 23 69 66 64  hods.#endif.#ifd
2f140 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44  ef SQLITE_SHARED
2f150 5f 4d 41 50 50 49 4e 47 0a 20 20 20 20 7c 7c 20  _MAPPING.    || 
2f160 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2f170 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2f180 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  s.#endif.  ){.  
2f190 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2f1a0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2f1b0 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2f1c0 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2f1d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f1e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f1f0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2f200 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49  ccurred in findI
2f210 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73  nodeInfo(), clos
2f220 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
2f230 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  iptor.      ** i
2f240 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f  mmediately, befo
2f250 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  re releasing the
2f260 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64   mutex. findInod
2f270 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c  eInfo() may fail
2f280 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f  .      ** in two
2f290 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20   scenarios:.    
2f2a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
2f2b0 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73  (a) A call to fs
2f2c0 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20  tat() failed..  
2f2d0 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d      **   (b) A m
2f2e0 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20  alloc failed..  
2f2f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2f300 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79  Scenario (b) may
2f310 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74   only occur if t
2f320 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  he process is ho
2f330 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20  lding no other. 
2f340 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73       ** file des
2f350 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e  criptors open on
2f360 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20   the same file. 
2f370 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74  If there were ot
2f380 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  her file.      *
2f390 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e  * descriptors on
2f3a0 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e   this file, then
2f3b0 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64   no malloc would
2f3c0 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a   be required by.
2f3d0 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f        ** findIno
2f3e0 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  deInfo(). If thi
2f3f0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
2f400 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
2f410 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
2f420 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
2f430 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2f440 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
2f450 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
2f460 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
2f470 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
2f480 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
2f490 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
2f4a0 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
2f4b0 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
2f4c0 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
2f4d0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
2f4e0 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
2f4f0 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
2f500 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
2f510 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
2f520 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
2f530 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
2f540 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
2f550 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
2f560 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2f570 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2f580 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2f590 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  );.      h = -1;
2f5a0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2f5b0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2f5c0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2f5d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2f5e0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
2f5f0 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
2f600 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2f610 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
2f620 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
2f630 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
2f640 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
2f650 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
2f660 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
2f670 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
2f680 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
2f690 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
2f6a0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
2f6b0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2f6c0 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
2f6d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
2f6e0 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
2f6f0 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
2f700 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2f710 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2f720 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f730 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61    /* NB: zFilena
2f740 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65  me exists and re
2f750 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
2f760 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c  l the file is cl
2f770 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63  osed.      ** ac
2f780 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
2f790 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
2f7a0 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
2f7b0 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
2f7c0 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
2f7d0 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20   filename. */.  
2f7e0 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
2f7f0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2f800 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76      pCtx->reserv
2f810 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72  ed = 0;.      sr
2f820 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20  andomdev();.    
2f830 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2f840 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ();.      rc = f
2f850 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2f860 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2f870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2f880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f890 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2f8a0 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67  ee(pNew->locking
2f8b0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
2f8c0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2f8d0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2f8e0 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d  );.        h = -
2f8f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2f900 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2f910 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d  );        .    }
2f920 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65  .  }.#endif..  e
2f930 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2f940 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63  Style == &dotloc
2f950 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
2f960 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63    /* Dotfile loc
2f970 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2f980 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2f990 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2f9a0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2f9b0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
2f9c0 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20  ontext .    */. 
2f9d0 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69     char *zLockFi
2f9e0 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c  le;.    int nFil
2f9f0 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  ename;.    asser
2fa00 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2fa10 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  );.    nFilename
2fa20 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2fa30 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
2fa40 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
2fa50 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
2fa60 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d  alloc64(nFilenam
2fa70 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
2fa80 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
2fa90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2faa0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  MEM_BKPT;.    }e
2fab0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2fac0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
2fad0 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
2fae0 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
2faf0 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
2fb00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
2fb10 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2fb20 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
2fb30 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
2fb40 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
2fb50 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2fb60 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
2fb70 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
2fb80 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
2fb90 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2fba0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2fbb0 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
2fbc0 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
2fbd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
2fbe0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
2fbf0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2fc00 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2fc10 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2fc20 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
2fc30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
2fc40 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
2fc50 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
2fc60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
2fc70 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
2fc80 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
2fc90 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
2fca0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2fcb0 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
2fcc0 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
2fcd0 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
2fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
2fcf0 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
2fd00 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
2fd10 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
2fd20 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
2fd30 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
2fd40 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
2fd50 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
2fd60 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
2fd70 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
2fd80 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
2fd90 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
2fda0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
2fdb0 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
2fdc0 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
2fdd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2fde0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2fdf0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
2fe00 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
2fe10 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
2fe20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2fe30 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
2fe40 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65  endif.  .  store
2fe50 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20  LastErrno(pNew, 
2fe60 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  0);.#if OS_VXWOR
2fe70 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  KS.  if( rc!=SQL
2fe80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2fe90 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2fea0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2feb0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20  _LINE__);.    h 
2fec0 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69  = -1;.    osUnli
2fed0 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
2fee0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2fef0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
2ff00 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69  ELETE;.  }.#endi
2ff10 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
2ff20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2ff30 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2ff40 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2ff50 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
2ff60 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
2ff70 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
2ff80 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
2ff90 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65  nter(+1);.    ve
2ffa0 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29  rifyDbFile(pNew)
2ffb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ffc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2ffd0 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
2ffe0 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68   directory in wh
2fff0 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f  ich to put tempo
30000 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49  rary files..** I
30010 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65  f no suitable te
30020 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72  mporary file dir
30030 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f  ectory can be fo
30040 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  und, return NULL
30050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
30060 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70  t char *unixTemp
30070 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20  FileDir(void){. 
30080 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
30090 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
300a0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
300b0 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
300c0 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
300d0 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
300e0 20 20 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20       ".".  };.  
300f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d  unsigned int i =
30100 20 30 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   0;.  struct sta
30110 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
30120 68 61 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c 69  har *zDir = sqli
30130 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
30140 72 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44 69  ry;..  if( !azDi
30150 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
30160 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
30170 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69  TE_TMPDIR");.  i
30180 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
30190 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
301a0 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
301b0 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66  while(1){.    if
301c0 28 20 7a 44 69 72 21 3d 30 0a 20 20 20 20 20 26  ( zDir!=0.     &
301d0 26 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26  & osStat(zDir, &
301e0 62 75 66 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  buf)==0.     && 
301f0 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
30200 6f 64 65 29 0a 20 20 20 20 20 26 26 20 6f 73 41  ode).     && osA
30210 63 63 65 73 73 28 7a 44 69 72 2c 20 30 33 29 3d  ccess(zDir, 03)=
30220 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
30230 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 20 20 20  return zDir;.   
30240 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 73 69   }.    if( i>=si
30250 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
30260 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 20 29  eof(azDirs[0]) )
30270 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 44 69 72   break;.    zDir
30280 20 3d 20 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a   = azDirs[i++];.
30290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
302a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
302b0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
302c0 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
302d0 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
302e0 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
302f0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
30300 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
30310 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
30320 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
30330 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
30340 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
30350 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
30360 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
30370 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74   *zBuf){.  const
30380 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69   char *zDir;.  i
30390 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  nt iLimit = 0;..
303a0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
303b0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
303c0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
303d0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
303e0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
303f0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
30400 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
30410 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
30420 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
30430 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
30440 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42 75 66 5b  g. .  */.  zBuf[
30450 30 5d 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61  0] = 0;.  Simula
30460 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
30470 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
30480 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78  ;..  zDir = unix
30490 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20  TempFileDir();. 
304a0 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72   if( zDir==0 ) r
304b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
304c0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3b 0a  RR_GETTEMPPATH;.
304d0 20 20 64 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b    do{.    u64 r;
304e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
304f0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
30500 29 2c 20 26 72 29 3b 0a 20 20 20 20 61 73 73 65  ), &r);.    asse
30510 72 74 28 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20  rt( nBuf>2 );.  
30520 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d    zBuf[nBuf-2] =
30530 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
30540 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
30550 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
30560 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
30570 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20  X"%llx%c",.     
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30590 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20  zDir, r, 0);.   
305a0 20 69 66 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32   if( zBuf[nBuf-2
305b0 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b  ]!=0 || (iLimit+
305c0 2b 29 3e 31 30 20 29 20 72 65 74 75 72 6e 20 53  +)>10 ) return S
305d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
305e0 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28  while( osAccess(
305f0 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
30600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30610 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
30620 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
30630 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
30640 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
30650 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
30660 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
30670 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
30680 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
30690 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
306a0 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
306b0 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
306c0 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
306d0 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
306e0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
306f0 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
30700 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
30710 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
30720 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
30730 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
30740 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
30750 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
30760 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
30770 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  tor that was ope
30780 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
30790 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f  ase .** file (no
307a0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d  t a journal or m
307b0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
307c0 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62  le) identified b
307d0 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50  y pathname.** zP
307e0 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ath with SQLITE_
307f0 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d  OPEN_XXX flags m
30800 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61  atching those pa
30810 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
30820 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  nd.** argument t
30830 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
30840 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69  .**.** Such a fi
30850 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61  le descriptor ma
30860 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74  y exist if a dat
30870 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
30880 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62   was closed.** b
30890 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
308a0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
308b0 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  r could not be c
308c0 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f  losed because so
308d0 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65  me.** other file
308e0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
308f0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
30900 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66  e is holding a f
30910 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66  ile-lock..** Ref
30920 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69  er to comments i
30930 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28  n the unixClose(
30940 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74  ) function and t
30950 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65  he lengthy comme
30960 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  nt.** describing
30970 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79   "Posix Advisory
30980 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65   Locking" at the
30990 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66   start of this f
309a0 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74  ile for .** furt
309b0 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73  her details. Als
309c0 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e  o, ticket #4018.
309d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74  .**.** If a suit
309e0 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
309f0 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  ptor is found, t
30a00 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e  hen it is return
30a10 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63  ed. If no.** suc
30a20 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
30a30 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31  r is located, -1
30a40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
30a50 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73  .static UnixUnus
30a60 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62  edFd *findReusab
30a70 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leFd(const char 
30a80 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67  *zPath, int flag
30a90 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  s){.  UnixUnused
30aa0 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b  Fd *pUnused = 0;
30ab0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65  ..  /* Do not se
30ac0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
30ad0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
30ae0 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e  or on vxworks. N
30af0 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  ot because.  ** 
30b00 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f  vxworks would no
30b10 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74  t benefit from t
30b20 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69  he change (it mi
30b30 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73  ght, we're not s
30b40 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62  ure),.  ** but b
30b50 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f  ecause no way to
30b60 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72   test it is curr
30b70 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e  ently available.
30b80 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20   It is better . 
30b90 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20   ** not to risk 
30ba0 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73  breaking vxworks
30bb0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
30bc0 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e   sake of such an
30bd0 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66   obscure .  ** f
30be0 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20  eature.  */.#if 
30bf0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74  !OS_VXWORKS.  st
30c00 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
30c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66     /* Results of
30c30 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a   stat() call */.
30c40 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
30c50 78 28 29 3b 0a 0a 20 20 2f 2a 20 41 20 73 74 61  x();..  /* A sta
30c60 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
30c70 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
30c80 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
30c90 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
30ca0 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
30cb0 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
30cc0 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
30cd0 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
30ce0 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
30cf0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
30d00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
30d10 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
30d20 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
30d30 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
30d40 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
30d50 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
30d60 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
30d70 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
30d80 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
30d90 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
30da0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
30db0 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
30dc0 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
30dd0 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
30de0 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
30df0 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
30e00 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
30e10 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
30e20 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c  r a reusable fil
30e30 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
30e40 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
30e50 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d   if( inodeList!=
30e60 30 20 26 26 20 30 3d 3d 6f 73 53 74 61 74 28 7a  0 && 0==osStat(z
30e70 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
30e80 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
30e90 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
30ea0 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
30eb0 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
30ec0 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
30ed0 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
30ee0 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f00 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
30f10 49 64 2e 69 6e 6f 21 3d 28 75 36 34 29 73 53 74  Id.ino!=(u64)sSt
30f20 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
30f30 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
30f40 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
30f50 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
30f60 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
30f70 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
30f80 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30f90 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
30fa0 64 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  d(pInode->pLockM
30fb0 75 74 65 78 29 20 29 3b 0a 20 20 20 20 20 20 73  utex) );.      s
30fc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
30fd0 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
30fe0 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  Mutex);.      fo
30ff0 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55  r(pp=&pInode->pU
31000 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a  nused; *pp && (*
31010 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67  pp)->flags!=flag
31020 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  s; pp=&((*pp)->p
31030 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55  Next));.      pU
31040 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20  nused = *pp;.   
31050 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
31060 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
31070 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a  pUnused->pNext;.
31080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
31090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
310a0 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  e(pInode->pLockM
310b0 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  utex);.    }.  }
310c0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
310d0 78 28 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 2f  x();.#endif    /
310e0 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  * if !OS_VXWORKS
310f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e   */.  return pUn
31100 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  used;.}../*.** F
31110 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20 75 69  ind the mode, ui
31120 64 20 61 6e 64 20 67 69 64 20 6f 66 20 66 69 6c  d and gid of fil
31130 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74 61  e zFile. .*/.sta
31140 74 69 63 20 69 6e 74 20 67 65 74 46 69 6c 65 4d  tic int getFileM
31150 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
31160 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  r *zFile,       
31170 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
31180 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20  ame */.  mode_t 
31190 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pMode,         
311a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
311b0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   Permissions of 
311c0 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f 74  zFile */.  uid_t
311d0 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20   *pUid,         
311e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
311f0 54 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c 65 2e  T: uid of zFile.
31200 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69   */.  gid_t *pGi
31210 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
31220 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69        /* OUT: gi
31230 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 29  d of zFile. */.)
31240 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
31250 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
31260 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66      /* Output of
31270 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62   stat() on datab
31280 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
31290 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
312a0 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61  ;.  if( 0==osSta
312b0 74 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74 29  t(zFile, &sStat)
312c0 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
312d0 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26   sStat.st_mode &
312e0 20 30 37 37 37 3b 0a 20 20 20 20 2a 70 55 69 64   0777;.    *pUid
312f0 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b   = sStat.st_uid;
31300 0a 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74  .    *pGid = sSt
31310 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65 6c  at.st_gid;.  }el
31320 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
31330 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
31340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
31350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
31360 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
31370 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
31380 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
31390 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
313a0 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
313b0 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
313c0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
313d0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
313e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
313f0 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
31400 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
31410 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
31420 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
31430 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
31440 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
31450 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
31460 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
31470 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
31480 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
31490 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
314a0 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
314b0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20  ..**.** In most 
314c0 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74  cases, this rout
314d0 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  ine sets *pMode 
314e0 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c  to 0, which will
314f0 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e   become.** an in
31500 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75  dication to robu
31510 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65  st_open() to cre
31520 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69  ate the file usi
31530 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46  ng.** SQLITE_DEF
31540 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
31550 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62  SIONS adjusted b
31560 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
31570 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20  But if the file 
31580 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
31590 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72  a WAL or regular
315a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
315b0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
315c0 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68  ction queries th
315d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
315e0 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  r the permission
315f0 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72  s on the .** cor
31600 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62  responding datab
31610 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ase file and set
31620 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73  s *pMode to this
31630 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72   value. Whenever
31640 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57   .** possible, W
31650 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  AL and journal f
31660 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
31670 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
31680 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
31690 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  as the associate
316a0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
316b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  .**.** If the SQ
316c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
316d0 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20  NAMES option is 
316e0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
316f0 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69  e.** original fi
31700 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69  lename is unavai
31710 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f  lable.  But 8_3_
31720 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73  NAMES is only us
31730 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69  ed for.** FAT fi
31740 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65  lesystems and pe
31750 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74  rmissions do not
31760 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73   matter there, s
31770 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68  o just use.** th
31780 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73  e default permis
31790 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
317a0 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46   int findCreateF
317b0 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ileMode(.  const
317c0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
317d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
317e0 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73  th of file (poss
317f0 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61  ibly) being crea
31800 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ted */.  int fla
31810 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
31820 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
31830 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20  s passed as 4th 
31840 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65  argument to xOpe
31850 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20  n() */.  mode_t 
31860 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pMode,         
31870 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
31880 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
31890 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a  open file with *
318a0 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c  /.  uid_t *pUid,
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20      /* OUT: uid 
318d0 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
318e0 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  le */.  gid_t *p
318f0 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
31900 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
31910 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  gid to set on th
31920 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  e file */.){.  i
31930 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31940 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
31950 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
31960 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20  .  *pMode = 0;. 
31970 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70   *pUid = 0;.  *p
31980 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66  Gid = 0;.  if( f
31990 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
319a0 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
319b0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
319c0 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44  ) ){.    char zD
319d0 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  b[MAX_PATHNAME+1
319e0 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ];     /* Databa
319f0 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  se file path */.
31a00 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20      int nDb;    
31a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
31a30 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44  alid bytes in zD
31a40 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  b */..    /* zPa
31a50 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
31a60 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
31a70 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
31a80 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
31a90 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
31aa0 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
31ab0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
31ac0 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
31ad0 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
31ae0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
31af0 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
31b00 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
31b10 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
31b20 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
31b30 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
31b40 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
31b50 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
31b60 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a   db>-journalNN".
31b70 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
31b80 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20  to db>-walNN".  
31b90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72    **.    ** wher
31ba0 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61  e NN is a decima
31bb0 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
31bc0 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20   naming schemes 
31bd0 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64  are .    ** used
31be0 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c   by the test_mul
31bf0 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e  tiplex.c module.
31c00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20  .    */.    nDb 
31c10 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
31c20 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20  0(zPath) - 1; . 
31c30 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
31c40 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
31c50 20 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20     /* In normal 
31c60 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65 20 6a  operation, the j
31c70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
31c80 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 63 6f 6e   will always con
31c90 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  tain.      ** a 
31ca0 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20 20  '-' character.  
31cb0 48 6f 77 65 76 65 72 20 69 6e 20 38 2b 33 20 66  However in 8+3 f
31cc0 69 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c 20 6f 72  ilename mode, or
31cd0 20 69 66 20 61 20 63 6f 72 72 75 70 74 0a 20 20   if a corrupt.  
31ce0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
31cf0 6a 6f 75 72 6e 61 6c 20 73 70 65 63 69 66 69 65  journal specifie
31d00 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
31d10 61 6c 20 77 69 74 68 20 61 20 67 6f 6f 66 79 20  al with a goofy 
31d20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  name, then.     
31d30 20 2a 2a 20 74 68 65 20 27 2d 27 20 6d 69 67 68   ** the '-' migh
31d40 74 20 62 65 20 6d 69 73 73 69 6e 67 2e 20 2a 2f  t be missing. */
31d50 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  .      if( nDb==
31d60 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 3d  0 || zPath[nDb]=
31d70 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='.' ) return SQ
31d80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e  LITE_OK;.      n
31d90 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Db--;.    }.    
31da0 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
31db0 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
31dc0 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
31dd0 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d     rc = getFileM
31de0 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c 20  ode(zDb, pMode, 
31df0 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 7d  pUid, pGid);.  }
31e00 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
31e10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
31e20 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
31e30 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
31e40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
31e50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
31e60 5f 55 52 49 20 29 7b 0a 20 20 20 20 2f 2a 20 49  _URI ){.    /* I
31e70 66 20 74 68 69 73 20 69 73 20 61 20 6d 61 69 6e  f this is a main
31e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
31e90 6e 64 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  nd the file was 
31ea0 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20 55  opened using a U
31eb0 52 49 0a 20 20 20 20 2a 2a 20 66 69 6c 65 6e 61  RI.    ** filena
31ec0 6d 65 2c 20 63 68 65 63 6b 20 66 6f 72 20 74 68  me, check for th
31ed0 65 20 22 6d 6f 64 65 6f 66 22 20 70 61 72 61 6d  e "modeof" param
31ee0 65 74 65 72 2e 20 49 66 20 70 72 65 73 65 6e 74  eter. If present
31ef0 2c 20 69 6e 74 65 72 70 72 65 74 0a 20 20 20 20  , interpret.    
31f00 2a 2a 20 69 74 73 20 76 61 6c 75 65 20 61 73 20  ** its value as 
31f10 61 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 74  a filename and t
31f20 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6d  ry to copy the m
31f30 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64  ode, uid and gid
31f40 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 61   from.    ** tha
31f50 74 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  t file.  */.    
31f60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
31f70 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
31f80 6d 65 74 65 72 28 7a 50 61 74 68 2c 20 22 6d 6f  meter(zPath, "mo
31f90 64 65 6f 66 22 29 3b 0a 20 20 20 20 69 66 28 20  deof");.    if( 
31fa0 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  z ){.      rc = 
31fb0 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 2c 20 70  getFileMode(z, p
31fc0 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64  Mode, pUid, pGid
31fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
31fe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31ff0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
32000 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50   zPath..** .** P
32010 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53  reviously, the S
32020 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75  QLite OS layer u
32030 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69  sed three functi
32040 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ons in place of 
32050 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a  this.** one:.**.
32060 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
32070 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b  OpenReadWrite();
32080 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
32090 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b  sOpenReadOnly();
320a0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
320b0 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
320c0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ;.**.** These ca
320d0 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  lls correspond t
320e0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
320f0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
32100 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
32110 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20   ReadWrite() -> 
32120 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c      (READWRITE |
32130 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20   CREATE).**     
32140 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20  ReadOnly()  ->  
32150 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a     (READONLY) .*
32160 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73  *     OpenExclus
32170 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52  ive() -> (READWR
32180 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45  ITE | CREATE | E
32190 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20  XCLUSIVE).**.** 
321a0 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c  The old OpenExcl
321b0 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64  usive() accepted
321c0 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d   a boolean argum
321d0 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e  ent - "delFlag".
321e0 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   If.** true, the
321f0 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67   file was config
32200 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d  ured to be autom
32210 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
32220 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c   when the.** fil
32230 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e  e handle closed.
32240 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20   To achieve the 
32250 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e  same effect usin
32260 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69  g this new .** i
32270 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68  nterface, add th
32280 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  e DELETEONCLOSE 
32290 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70  flag to those sp
322a0 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f  ecified above fo
322b0 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73  r .** OpenExclus
322c0 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ive()..*/.static
322d0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20   int unixOpen(. 
322e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
322f0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fs,           /*
32300 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69   The VFS for whi
32310 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78  ch this is the x
32320 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Open method */. 
32330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
32340 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th,           /*
32350 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c   Pathname of fil
32360 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  e to be opened *
32370 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
32380 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
32390 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
323a0 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69  criptor to be fi
323b0 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  lled in */.  int
323c0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
323d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
323e0 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74  ut flags to cont
323f0 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  rol the opening 
32400 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
32410 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
32420 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67    /* Output flag
32430 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
32440 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a  Lite core */.){.
32450 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
32460 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c  (unixFile *)pFil
32470 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  e;.  int fd = -1
32480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32490 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
324a0 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20  riptor returned 
324b0 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  by open() */.  i
324c0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
324d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
324e0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
324f0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
32500 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
32510 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
32520 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
32530 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
32540 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
32550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
32560 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
32570 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
32580 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32590 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
325a0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
325b0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
325c0 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20   ctrlFlags = 0; 
325d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
325e0 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20  NIXFILE_* flags 
325f0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
32600 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
32610 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
32620 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
32630 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
32640 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
32650 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
32660 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
32670 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
32680 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
32690 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
326a0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
326b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
326c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
326d0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
326e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
326f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
32700 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
32710 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32720 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
32730 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
32740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
32750 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23  PROXY);.#endif.#
32760 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
32770 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
32780 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
32790 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74  TYLE.  struct st
327a0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e  atfs fsInfo;.#en
327b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  dif..  /* If cre
327c0 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
327d0 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
327e0 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
327f0 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
32800 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
32810 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
32820 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
32830 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
32840 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
32850 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
32860 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
32870 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
32880 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
32890 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4e 65  .  */.  int isNe
328a0 77 4a 72 6e 6c 20 3d 20 28 69 73 43 72 65 61 74  wJrnl = (isCreat
328b0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
328c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
328d0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
328e0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
328f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
32900 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
32910 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
32920 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
32930 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
32940 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
32950 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
32960 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
32970 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
32980 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
32990 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
329a0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
329b0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
329c0 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
329d0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
329e0 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  +2];.  const cha
329f0 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68  r *zName = zPath
32a00 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
32a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
32a20 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
32a30 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
32a40 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
32a50 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
32a60 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
32a70 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
32a80 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
32a90 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
32aa0 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
32ab0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
32ac0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
32ad0 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
32ae0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
32af0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
32b00 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
32b10 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
32b20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
32b30 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
32b40 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
32b50 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
32b60 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
32b70 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
32b80 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
32b90 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
32ba0 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
32bb0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
32bc0 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
32bd0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
32be0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
32bf0 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
32c00 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
32c10 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
32c20 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
32c30 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
32c40 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
32c50 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
32c60 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
32c70 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
32c80 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
32c90 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
32ca0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
32cb0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
32cc0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
32cd0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
32ce0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
32cf0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
32d00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
32d10 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
32d20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
32d30 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
32d40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
32d50 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
32d60 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
32d70 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
32d80 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
32d90 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
32da0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
32db0 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
32dc0 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
32dd0 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
32de0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
32df0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
32e00 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
32e10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
32e20 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
32e30 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
32e40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
32e50 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
32e60 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
32e70 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
32e80 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
32e90 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
32ea0 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
32eb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
32ec0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
32ed0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
32ee0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
32ef0 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
32f00 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
32f10 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74   );..  /* Detect
32f20 20 61 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e   a pid change an
32f30 64 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47  d reset the PRNG
32f40 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61  .  There is a ra
32f50 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a  ce condition.  *
32f60 2a 20 68 65 72 65 20 73 75 63 68 20 74 68 61 74  * here such that
32f70 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72   two or more thr
32f80 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20  eads all trying 
32f90 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
32fa0 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61  s at.  ** the sa
32fb0 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74  me instant might
32fc0 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50   all reset the P
32fd0 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70  RNG.  But multip
32fe0 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61  le resets.  ** a
32ff0 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  re harmless..  *
33000 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65  /.  if( randomne
33010 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69 64 28  ssPid!=osGetpid(
33020 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d  0) ){.    random
33030 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70  nessPid = osGetp
33040 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  id(0);.    sqlit
33050 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c  e3_randomness(0,
33060 30 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  0);.  }.  memset
33070 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
33080 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
33090 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
330a0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
330b0 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
330c0 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
330d0 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
330e0 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
330f0 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
33100 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
33110 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
33120 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33130 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
33140 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
33150 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
33160 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73        if( !pUnus
33170 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
33180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33190 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  M_BKPT;.      }.
331a0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72      }.    p->pPr
331b0 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
331c0 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20   = pUnused;..   
331d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
331e0 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c  enames are doubl
331f0 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
33200 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  d if they are no
33210 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69  t.    ** URIs wi
33220 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  th parameters.  
33230 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20  Hence, they can 
33240 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64  always be passed
33250 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c   into.    ** sql
33260 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
33270 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73  er(). */.    ass
33280 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51  ert( (flags & SQ
33290 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
332a0 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  | zName[strlen(z
332b0 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a  Name)+1]==0 );..
332c0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61    }else if( !zNa
332d0 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  me ){.    /* If 
332e0 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74  zName is NULL, t
332f0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69  he upper layer i
33300 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74  s requesting a t
33310 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  emp file. */.   
33320 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
33330 20 26 26 20 21 69 73 4e 65 77 4a 72 6e 6c 29 3b   && !isNewJrnl);
33340 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
33350 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2d 3e  tTempname(pVfs->
33360 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 6d 70  mxPathname, zTmp
33370 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
33380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33390 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
333a0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
333b0 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20   = zTmpname;..  
333c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74    /* Generated t
333d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
333e0 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f  es are always do
333f0 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e  uble-zero termin
33400 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ated.    ** for 
33410 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75  use by sqlite3_u
33420 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
33430 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
33440 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d  Name[strlen(zNam
33450 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a  e)+1]==0 );.  }.
33460 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
33470 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
33480 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
33490 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
334a0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
334b0 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
334c0 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
334d0 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
334e0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
334f0 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
33500 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
33510 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
33520 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
33530 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
33540 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
33550 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
33560 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
33570 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
33580 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
33590 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
335a0 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
335b0 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
335c0 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
335d0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
335e0 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
335f0 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
33600 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
33610 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
33620 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
33630 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
33640 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
33650 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
33660 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
33670 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e     /* Permission
33680 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65  s to create file
33690 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64   with */.    uid
336a0 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20  _t uid;         
336b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
336c0 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  erid for the fil
336d0 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67  e */.    gid_t g
336e0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
336f0 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69         /* Groupi
33700 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
33710 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43  /.    rc = findC
33720 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
33730 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65  ame, flags, &ope
33740 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69  nMode, &uid, &gi
33750 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
33760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33770 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70     assert( !p->p
33780 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
33790 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
337a0 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
337b0 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
337c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
337d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
337e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
337f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
33800 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
33810 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
33820 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
33830 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20  TRACE(("OPENX   
33840 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
33850 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
33860 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65  lags));.    asse
33870 72 74 28 20 21 69 73 45 78 63 6c 75 73 69 76 65  rt( !isExclusive
33880 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26   || (openFlags &
33890 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a   O_CREAT)!=0 );.
338a0 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
338b0 20 20 20 20 20 20 69 66 28 20 69 73 4e 65 77 4a        if( isNewJ
338c0 72 6e 6c 20 26 26 20 65 72 72 6e 6f 3d 3d 45 41  rnl && errno==EA
338d0 43 43 45 53 20 26 26 20 6f 73 41 63 63 65 73 73  CCES && osAccess
338e0 28 7a 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 7b  (zName, F_OK) ){
338f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 75  .        /* If u
33900 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  nable to create 
33910 61 20 6a 6f 75 72 6e 61 6c 20 62 65 63 61 75 73  a journal becaus
33920 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
33930 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
33940 2a 20 77 72 69 74 61 62 6c 65 2c 20 63 68 61 6e  * writable, chan
33950 67 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ge the error cod
33960 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
33970 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  at. */.        r
33980 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
33990 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3b 0a 20  NLY_DIRECTORY;. 
339a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
339b0 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
339c0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
339d0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64         /* Failed
339e0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
339f0 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
33a00 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
33a10 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
33a20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
33a30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
33a40 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
33a50 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
33a60 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
33a70 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
33a80 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
33a90 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
33aa0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
33ab0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
33ac0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 69  DONLY;.        i
33ad0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
33ae0 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
33af0 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
33b00 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
33b10 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
33b20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
33b30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
33b40 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
33b50 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
33b60 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e  BKPT, "open", zN
33b70 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
33b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
33b90 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
33ba0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
33bb0 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
33bc0 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
33bd0 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
33be0 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61  root and if crea
33bf0 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62  ting a new rollb
33c00 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  ack.    ** journ
33c10 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20  al or WAL file, 
33c20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69  set the ownershi
33c30 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p of the journal
33c40 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20   or WAL to be.  
33c50 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73    ** the same as
33c60 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
33c70 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
33c80 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28     if( flags & (
33c90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
33ca0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
33cb0 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
33cc0 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
33cd0 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
33ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
33cf0 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
33d00 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
33d10 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
33d20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
33d30 28 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ( p->pPreallocat
33d40 65 64 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  edUnused ){.    
33d50 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
33d60 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
33d70 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f  .    p->pPreallo
33d80 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 6c 61  catedUnused->fla
33d90 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
33da0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
33db0 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
33dc0 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e  S.    zPath = zN
33dd0 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  ame;.#elif defin
33de0 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b  ed(SQLITE_UNLINK
33df0 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20  _AFTER_CLOSE).  
33e00 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65    zPath = sqlite
33e10 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
33e20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
33e30 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  zPath==0 ){.    
33e40 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
33e50 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
33e60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
33e70 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
33e80 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
33e90 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29   osUnlink(zName)
33ea0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
33eb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
33ec0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65  OCKING_STYLE.  e
33ed0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e  lse{.    p->open
33ee0 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  Flags = openFlag
33ef0 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  s;.  }.#endif.  
33f00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
33f10 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
33f20 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
33f30 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74  _STYLE.  if( fst
33f40 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
33f50 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73  ) == -1 ){.    s
33f60 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c  toreLastErrno(p,
33f70 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62   errno);.    rob
33f80 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
33f90 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
33fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
33fb0 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
33fc0 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
33fd0 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
33fe0 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
33ff0 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
34000 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
34010 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
34020 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
34030 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
34040 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74  = strncmp("exfat
34050 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
34060 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
34070 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
34080 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
34090 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
340a0 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
340b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75  ndif..  /* Set u
340c0 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74  p appropriate ct
340d0 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28  rlFlags */.  if(
340e0 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20   isDelete )     
340f0 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
34100 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
34110 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69  _DELETE;.  if( i
34120 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20  sReadonly )     
34130 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
34140 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52  gs |= UNIXFILE_R
34150 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b 20  DONLY;.  noLock 
34160 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
34170 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20 20  OPEN_MAIN_DB;.  
34180 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20  if( noLock )    
34190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
341a0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
341b0 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66  ILE_NOLOCK;.  if
341c0 28 20 69 73 4e 65 77 4a 72 6e 6c 20 29 20 20 20  ( isNewJrnl )   
341d0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
341e0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
341f0 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28  E_DIRSYNC;.  if(
34200 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
34210 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46  OPEN_URI ) ctrlF
34220 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
34230 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54  _URI;..#if SQLIT
34240 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34250 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54  _STYLE.#if SQLIT
34260 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
34270 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50  OCKING.  isAutoP
34280 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  roxy = 1;.#endif
34290 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f  .  if( isAutoPro
342a0 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55  xy && (zPath!=NU
342b0 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29  LL) && (!noLock)
342c0 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20   && pVfs->xOpen 
342d0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76  ){.    char *env
342e0 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22  force = getenv("
342f0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
34300 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20  XY_LOCKING");.  
34310 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d    int useProxy =
34320 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49   0;..    /* SQLI
34330 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
34340 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20  OCKING==1 means 
34350 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65  force always use
34360 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20   proxy, 0 means 
34370 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73  .    ** never us
34380 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65  e proxy, NULL me
34390 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f  ans use proxy fo
343a0 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  r non-local file
343b0 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20  s only.  */.    
343c0 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55  if( envforce!=NU
343d0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50  LL ){.      useP
343e0 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66  roxy = atoi(envf
343f0 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c  orce)>0;.    }el
34400 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f  se{.      usePro
34410 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f  xy = !(fsInfo.f_
34420 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29  flags&MNT_LOCAL)
34430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34440 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  useProxy ){.    
34450 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
34460 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
34470 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
34480 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  rlFlags);.      
34490 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
344a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
344b0 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  = proxyTransform
344c0 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69  UnixFile((unixFi
344d0 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74  le*)pFile, ":aut
344e0 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  o:");.        if
344f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
34510 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f  Use unixClose to
34520 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
34530 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e  sources added in
34540 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20   fillInUnixFile 
34550 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
34560 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20  d clear all the 
34570 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65  structure's refe
34580 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69  rences.  Specifi
34590 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20  cally, .        
345a0 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74    ** pFile->pMet
345b0 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c  hods will be NUL
345c0 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c  L so sqlite3OsCl
345d0 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ose will be a no
345e0 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a  -op .          *
345f0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  /.          unix
34600 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20  Close(pFile);.  
34610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
34620 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
34630 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
34640 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
34650 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
34660 20 20 0a 20 20 61 73 73 65 72 74 28 20 7a 50 61    .  assert( zPa
34670 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 30  th==0 || zPath[0
34680 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20 7c 7c  ]=='/' .      ||
34690 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
346a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
346b0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
346c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
346d0 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20 72 63  URNAL .  );.  rc
346e0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
346f0 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
34700 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
34710 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69  ags);..open_fini
34720 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
34730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34740 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
34750 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
34760 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  used);.  }.  ret
34770 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
34780 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
34790 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
347a0 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
347b0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
347c0 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
347d0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
347e0 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
347f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
34800 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  xDelete(.  sqlit
34810 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
34820 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74       /* VFS cont
34830 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74  aining this as t
34840 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f  he xDelete metho
34850 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
34860 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
34870 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
34880 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
34890 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20  /.  int dirSync 
348a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
348b0 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28   If true, fsync(
348c0 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  ) directory afte
348d0 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20  r deleting file 
348e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
348f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e   SQLITE_OK;.  UN
34900 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
34910 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
34920 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
34930 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
34940 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73  ELETE);.  if( os
34950 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  Unlink(zPath)==(
34960 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65  -1) ){.    if( e
34970 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66  rrno==ENOENT.#if
34980 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
34990 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73 28      || osAccess(
349a0 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e 64  zPath,0)!=0.#end
349b0 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  if.    ){.      
349c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
349d0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a  R_DELETE_NOENT;.
349e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
349f0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
34a00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
34a10 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22  DELETE, "unlink"
34a20 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
34a30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34a40 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
34a50 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
34a60 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63  C.  if( (dirSync
34a70 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20   & 1)!=0 ){.    
34a80 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
34a90 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
34aa0 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20  (zPath, &fd);.  
34ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
34ad0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64 2c 30   full_fsync(fd,0
34ae0 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,0) ){.        r
34af0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
34b00 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  (SQLITE_IOERR_DI
34b10 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22  R_FSYNC, "fsync"
34b20 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
34b30 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  }.      robust_c
34b40 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
34b50 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
34b60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
34b70 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
34b80 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20  PEN );.      rc 
34b90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
34ba0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
34bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34bc0 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69  .** Test the exi
34bd0 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63  stence of or acc
34be0 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ess permissions 
34bf0 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54  of file zPath. T
34c00 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f  he.** test perfo
34c10 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rmed depends on 
34c20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61  the value of fla
34c30 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  gs:.**.**     SQ
34c40 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
34c50 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TS: Return 1 if 
34c60 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a  the file exists.
34c70 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
34c80 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20  CESS_READWRITE: 
34c90 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
34ca0 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64  file is read and
34cb0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20   writable..**   
34cc0 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
34cd0 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e  READONLY: Return
34ce0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
34cf0 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a  s readable..**.*
34d00 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75  * Otherwise retu
34d10 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
34d20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a  int unixAccess(.
34d30 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
34d40 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65  otUsed,   /* The
34d50 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
34d60 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74  this xAccess met
34d70 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
34d80 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
34d90 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20   /* Path of the 
34da0 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20  file to examine 
34db0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
34dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34dd0 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20  What do we want 
34de0 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74  to learn about t
34df0 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a  he zPath file? *
34e00 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
34e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
34e20 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c  rite result bool
34e30 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ean here */.){. 
34e40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34e50 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
34e60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
34e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
34e80 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
34e90 61 73 73 65 72 74 28 20 70 52 65 73 4f 75 74 21  assert( pResOut!
34ea0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =0 );..  /* The 
34eb0 73 70 65 63 20 73 61 79 73 20 74 68 65 72 65 20  spec says there 
34ec0 61 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 62  are three possib
34ed0 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 66 6c  le values for fl
34ee0 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a 20  ags.  But only. 
34ef0 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d 20   ** two of them 
34f00 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65  are actually use
34f10 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66  d */.  assert( f
34f20 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
34f30 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20 66 6c  ESS_EXISTS || fl
34f40 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
34f50 53 53 5f 52 45 41 44 57 52 49 54 45 20 29 3b 0a  SS_READWRITE );.
34f60 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51  .  if( flags==SQ
34f70 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
34f80 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  TS ){.    struct
34f90 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 2a   stat buf;.    *
34fa0 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f 73  pResOut = (0==os
34fb0 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66  Stat(zPath, &buf
34fc0 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65  ) && buf.st_size
34fd0 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >0);.  }else{.  
34fe0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73 41    *pResOut = osA
34ff0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57 5f 4f  ccess(zPath, W_O
35000 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d 0a  K|R_OK)==0;.  }.
35010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35020 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  OK;.}../*.**.*/.
35030 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46 75 6c  static int mkFul
35040 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e  lPathname(.  con
35050 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
35060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35070 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  Input path */.  
35080 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20 20  char *zOut,     
35090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350a0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
350b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20 20   */.  int nOut  
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350d0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
350e0 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66 66 65  ed size of buffe
350f0 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20 69  r zOut */.){.  i
35100 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c 69 74  nt nPath = sqlit
35110 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
35120 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  );.  int iOff = 
35130 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  0;.  if( zPath[0
35140 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 66  ]!='/' ){.    if
35150 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c  ( osGetcwd(zOut,
35160 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b 0a 20   nOut-2)==0 ){. 
35170 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
35180 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
35190 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
351a0 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b  getcwd", zPath);
351b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
351c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
351d0 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f 75  0(zOut);.    zOu
351e0 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f 27 3b  t[iOff++] = '/';
351f0 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f 66 66  .  }.  if( (iOff
35200 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74 20 29  +nPath+1)>nOut )
35210 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20  {.    /* SQLite 
35220 61 73 73 75 6d 65 73 20 74 68 61 74 20 78 46 75  assumes that xFu
35230 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e 75 6c  llPathname() nul
35240 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20  -terminates the 
35250 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a 20 20  output buffer.  
35260 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69 74 20    ** even if it 
35270 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
35280 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74 5b 69  .  */.    zOut[i
35290 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  Off] = '\0';.   
352a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
352b0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
352c0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
352d0 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66 2c 20  intf(nOut-iOff, 
352e0 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22 25 73  &zOut[iOff], "%s
352f0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72 65 74  ", zPath);.  ret
35300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
35310 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
35320 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
35330 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
35340 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
35350 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
35360 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
35370 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
35380 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
35390 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
353a0 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
353b0 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
353c0 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
353d0 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
353e0 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
353f0 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
35400 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
35410 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
35420 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
35430 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
35440 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
35450 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
35460 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
35470 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
35480 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
35490 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
354a0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
354b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
354c0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
354d0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
354e0 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
354f0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
35500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35510 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
35520 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
35530 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
35540 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
35550 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
35560 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 23  t buffer */.){.#
35570 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
35580 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20 21 64  _READLINK) || !d
35590 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53 54 41  efined(HAVE_LSTA
355a0 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b 46 75  T).  return mkFu
355b0 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61 74 68  llPathname(zPath
355c0 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 23  , zOut, nOut);.#
355d0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20 3d 20  else.  int rc = 
355e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
355f0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e 4c   nByte;.  int nL
35600 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ink = 1;        
35610 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35620 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20 6c 69  r of symbolic li
35630 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73 6f 20  nks followed so 
35640 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  far */.  const c
35650 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61 74 68  har *zIn = zPath
35660 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
35670 70 61 74 68 20 66 6f 72 20 65 61 63 68 20 69 74  path for each it
35680 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20  eration of loop 
35690 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 20  */.  char *zDel 
356a0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
356b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
356c0 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
356d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
356e0 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f  ETER(pVfs);..  /
356f0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
35700 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
35710 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
35720 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
35730 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
35740 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
35750 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
35760 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
35770 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
35780 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
35790 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
357a0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
357b0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
357c0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
357d0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
357e0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
357f0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
35800 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
35810 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
35820 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a 20 43    do {..    /* C
35830 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20 70 61  all stat() on pa
35840 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c 69 6e  th zIn. Set bLin
35850 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  k to true if the
35860 20 70 61 74 68 20 69 73 20 61 20 73 79 6d 62 6f   path is a symbo
35870 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 2c  lic.    ** link,
35880 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
35890 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ise.  */.    int
358a0 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20 20 20   bLink = 0;.    
358b0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
358c0 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74 61 74  .    if( osLstat
358d0 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30 20 29  (zIn, &buf)!=0 )
358e0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
358f0 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  o!=ENOENT ){.   
35900 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
35910 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
35920 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6c 73  NTOPEN_BKPT, "ls
35930 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20  tat", zIn);.    
35940 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
35950 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53 5f 49       bLink = S_I
35960 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SLNK(buf.st_mode
35970 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
35980 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20 20 20  ( bLink ){.     
35990 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 7b 0a   if( zDel==0 ){.
359a0 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d 20 73          zDel = s
359b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f  qlite3_malloc(nO
359c0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ut);.        if(
359d0 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20 3d 20   zDel==0 ) rc = 
359e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
359f0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  T;.      }else i
35a00 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c 49 54  f( ++nLink>SQLIT
35a10 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 29  E_MAX_SYMLINKS )
35a20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
35a30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
35a40 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  KPT;.      }..  
35a50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35a70 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61 64 6c   nByte = osReadl
35a80 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c 20 6e  ink(zIn, zDel, n
35a90 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Out-1);.        
35aa0 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20  if( nByte<0 ){. 
35ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
35ac0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
35ad0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
35ae0 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 49 6e   "readlink", zIn
35af0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
35b00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
35b10 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a  zDel[0]!='/' ){.
35b20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
35b30 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  n;.            f
35b40 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  or(n = sqlite3St
35b50 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e 3e 30  rlen30(zIn); n>0
35b60 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d 27 2f   && zIn[n-1]!='/
35b70 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20 20  '; n--);.       
35b80 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 2b 6e       if( nByte+n
35b90 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  +1>nOut ){.     
35ba0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
35bb0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
35bc0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
35bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35be0 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 44       memmove(&zD
35bf0 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e 42 79  el[n], zDel, nBy
35c00 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  te+1);.         
35c10 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c       memcpy(zDel
35c20 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20 20 20  , zIn, n);.     
35c30 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 2b           nByte +
35c40 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = n;.           
35c50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
35c60 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b 6e 42           zDel[nB
35c70 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  yte] = '\0';.   
35c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
35c90 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44 65 6c        zIn = zDel
35ca0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
35cb0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
35cc0 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75 74 20  OK || zIn!=zOut 
35cd0 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27 20 29  || zIn[0]=='/' )
35ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
35cf0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e 21 3d  LITE_OK && zIn!=
35d00 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 63  zOut ){.      rc
35d10 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d   = mkFullPathnam
35d20 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e 4f 75  e(zIn, zOut, nOu
35d30 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
35d40 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62 72 65  ( bLink==0 ) bre
35d50 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20 7a 4f  ak;.    zIn = zO
35d60 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  ut;.  }while( rc
35d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
35d80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
35d90 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Del);.  return r
35da0 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 48  c;.#endif   /* H
35db0 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26 26 20  AVE_READLINK && 
35dc0 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a 7d 0a  HAVE_LSTAT */.}.
35dd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
35de0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
35df0 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
35e00 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
35e10 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
35e20 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
35e30 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
35e40 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
35e50 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
35e60 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
35e70 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
35e80 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
35e90 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
35ea0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
35eb0 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
35ec0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
35ed0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
35ee0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
35ef0 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
35f00 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
35f10 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
35f20 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
35f30 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
35f40 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
35f50 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
35f60 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
35f70 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
35f80 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
35f90 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
35fa0 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
35fb0 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
35fc0 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
35fd0 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
35fe0 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
35ff0 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
36000 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
36010 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
36020 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
36030 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
36040 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
36050 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
36060 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
36070 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
36080 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
36090 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
360a0 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Out){.  const ch
360b0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53  ar *zErr;.  UNUS
360c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
360d0 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Used);.  unixEnt
360e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
360f0 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
36100 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
36110 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36120 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
36130 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
36140 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
36150 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
36160 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28  oid (*unixDlSym(
36170 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
36180 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63  Used, void *p, c
36190 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
361a0 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20  (void){.  /* .  
361b0 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64  ** GCC with -ped
361c0 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79  antic-errors say
361d0 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20  s that C90 does 
361e0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64  not allow a void
361f0 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73  * to be.  ** cas
36200 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  t into a pointer
36210 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
36220 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62   And yet the lib
36230 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75  rary dlsym() rou
36240 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  tine.  ** return
36250 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20  s a void* which 
36260 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
36270 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
36280 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65  n.  So how do we
36290 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28  .  ** use dlsym(
362a0 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  ) with -pedantic
362b0 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20  -errors?.  **.  
362c0 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65  ** Variable x be
362d0 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74  low is defined t
362e0 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  o be a pointer t
362f0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  o a function tak
36300 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ing.  ** paramet
36310 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f  ers void* and co
36320 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65  nst char* and re
36330 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65  turning a pointe
36340 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
36350 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c  .  ** We initial
36360 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69  ize x by assigni
36370 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20  ng it a pointer 
36380 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66  to the dlsym() f
36390 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54  unction..  ** (T
363a0 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72  hat assignment r
363b0 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29  equires a cast.)
363c0 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74    Then we call t
363d0 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  he function that
363e0 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74  .  ** x points t
363f0 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  o.  .  **.  ** T
36400 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
36410 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77  is unlikely to w
36420 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
36430 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72   any system wher
36440 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c  e.  ** you reall
36450 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20  y cannot cast a 
36460 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
36470 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75   into void*.  Bu
36480 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20  t then, on the. 
36490 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20   ** other hand, 
364a0 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74  dlsym() will not
364b0 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20   work on such a 
364c0 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73  system either, s
364d0 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e  o we have.  ** n
364e0 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61  ot really lost a
364f0 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  nything..  */.  
36500 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64  void (*(*x)(void
36510 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
36520 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  void);.  UNUSED_
36530 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
36540 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28  d);.  x = (void(
36550 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  *(*)(void*,const
36560 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64   char*))(void))d
36570 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28  lsym;.  return (
36580 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  *x)(p, zSym);.}.
36590 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
365a0 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
365b0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
365c0 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
365d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
365e0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
365f0 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
36600 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
36610 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
36620 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
36630 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
36640 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
36650 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
36660 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
36670 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
36680 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
36690 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
366a0 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
366b0 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
366c0 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
366d0 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
366e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
366f0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
36700 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
36710 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
36720 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
36730 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
36740 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
36750 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
36760 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
36770 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
36780 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
36790 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
367a0 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
367b0 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
367c0 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
367d0 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
367e0 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
367f0 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
36800 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
36810 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
36820 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
36830 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
36840 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
36850 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
36860 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
36870 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
36880 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
36890 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
368a0 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
368b0 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
368c0 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
368d0 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
368e0 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
368f0 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
36900 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
36910 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
36920 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
36930 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
36940 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
36950 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
36960 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
36970 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
36980 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
36990 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
369a0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
369b0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
369c0 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
369d0 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
369e0 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
369f0 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
36a00 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61 6e   0, nBuf);.  ran
36a10 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47  domnessPid = osG
36a20 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66 20  etpid(0);  .#if 
36a30 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
36a40 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65  TEST) && !define
36a50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41  d(SQLITE_OMIT_RA
36a60 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20 20  NDOMNESS).  {.  
36a70 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20    int fd, got;. 
36a80 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
36a90 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
36aa0 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
36ab0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
36ac0 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
36ad0 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
36ae0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
36af0 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
36b00 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t));.      memcp
36b10 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74  y(&zBuf[sizeof(t
36b20 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50  )], &randomnessP
36b30 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f  id, sizeof(rando
36b40 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20  mnessPid));.    
36b50 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
36b60 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f  (t)+sizeof(rando
36b70 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65  mnessPid)<=(size
36b80 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
36b90 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
36ba0 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ) + sizeof(rando
36bb0 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d  mnessPid);.    }
36bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20  else{.      do{ 
36bd0 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c  got = osRead(fd,
36be0 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77   zBuf, nBuf); }w
36bf0 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
36c00 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
36c10 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
36c20 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
36c30 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
36c40 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
36c50 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
36c60 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
36c70 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
36c80 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
36c90 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
36ca0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
36cb0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
36cc0 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
36cd0 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
36ce0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
36cf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
36d00 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
36d10 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
36d20 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
36d30 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
36d40 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
36d50 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
36d60 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
36d70 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
36d80 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
36d90 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
36da0 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
36db0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
36dc0 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
36dd0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
36de0 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
36df0 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
36e00 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
36e10 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
36e20 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
36e30 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
36e40 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
36e50 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
36e60 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
36e70 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
36e80 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
36e90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
36ea0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
36eb0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
36ec0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
36ed0 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
36ee0 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
36ef0 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
36f00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36f10 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
36f20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
36f30 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
36f40 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
36f50 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
36f60 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
36f70 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
36f80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
36f90 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
36fa0 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
36fb0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
36fc0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
36fd0 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
36fe0 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
36ff0 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
37000 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
37010 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
37020 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
37030 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
37040 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
37050 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
37060 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
37070 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
37080 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
37090 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
370a0 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
370b0 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
370c0 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
370d0 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
370e0 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
370f0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
37100 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
37110 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
37120 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
37130 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
37140 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
37150 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
37160 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
37170 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
37180 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
37190 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
371a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
371b0 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
371c0 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
371d0 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
371e0 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
371f0 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
37200 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
37210 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
37220 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
37230 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
37240 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
37250 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
37260 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
37270 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
37280 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
37290 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
372a0 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
372b0 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
372c0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
372d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
372e0 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
372f0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
37300 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
37310 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
37320 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
37330 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37340 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  TE_OK;.#if defin
37350 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
37360 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
37370 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  (&t);.  *piNow =
37380 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
37390 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45  )t)*1000 + unixE
373a0 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  poch;.#elif OS_V
373b0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
373c0 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
373d0 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
373e0 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
373f0 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  sNow);.  *piNow 
37400 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
37410 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
37420 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
37430 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30  sNow.tv_nsec/100
37440 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  0000;.#else.  st
37450 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
37460 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74 74 69  w;.  (void)getti
37470 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
37480 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66 61  );  /* Cannot fa
37490 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64 20 61  il given valid a
374a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a 70  rguments */.  *p
374b0 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
374c0 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
374d0 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
374e0 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  ec + sNow.tv_use
374f0 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a  c/1000;.#endif..
37500 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
37510 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
37520 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
37530 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
37540 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
37550 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
37560 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
37570 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
37580 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
37590 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
375a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
375b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
375c0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
375d0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
375e0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
375f0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
37600 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
37610 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
37620 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
37630 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
37640 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
37650 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
37660 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
37670 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
37680 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
37690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
376a0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
376b0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
376c0 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
376d0 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
376e0 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  t64 i = 0;.  int
376f0 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   rc;.  UNUSED_PA
37700 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
37710 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72  ;.  rc = unixCur
37720 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
37730 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
37740 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
37750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
37760 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
37770 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30 0a 23  xCurrentTime 0.#
37780 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
37790 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
377a0 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73 69 67   method is desig
377b0 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20  ned to return a 
377c0 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d 6c 65  better.** low-le
377d0 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67  vel error messag
377e0 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  e when operating
377f0 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73  -system problems
37800 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69   come up.** duri
37810 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74  ng SQLite operat
37820 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 20 69  ion.  Only the i
37830 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
37840 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  de is currently.
37850 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  ** used..*/.stat
37860 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
37870 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
37880 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
37890 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
378a0 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
378b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
378c0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
378d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
378e0 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
378f0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
37900 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  ed3);.  return e
37910 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rrno;.}.../*.***
37920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37930 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
37940 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
37950 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
37960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
37970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
379a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
379b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
379c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
379d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
379e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
379f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
37a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a20 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
37a30 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
37a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
37a60 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
37a70 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
37a80 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
37a90 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
37aa0 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
37ab0 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
37ac0 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
37ad0 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
37ae0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
37af0 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
37b00 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
37b10 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
37b20 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
37b30 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
37b40 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
37b50 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
37b60 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
37b70 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
37b80 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
37b90 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
37ba0 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
37bb0 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
37bc0 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
37bd0 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
37be0 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
37bf0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
37c00 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
37c10 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
37c20 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
37c30 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
37c40 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
37c50 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
37c60 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
37c70 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
37c80 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
37c90 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
37ca0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
37cb0 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
37cc0 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
37cd0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
37ce0 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
37cf0 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
37d00 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
37d10 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
37d20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
37d30 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
37d40 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
37d50 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
37d60 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
37d70 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
37d80 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
37d90 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
37da0 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
37db0 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
37dc0 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
37dd0 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
37de0 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
37df0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
37e00 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
37e10 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
37e20 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
37e30 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
37e40 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
37e50 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
37e60 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
37e70 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
37e80 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
37e90 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
37ea0 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
37eb0 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
37ec0 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
37ed0 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
37ee0 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
37ef0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
37f00 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
37f10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
37f20 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
37f30 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
37f40 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20  40000000.**     
37f50 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
37f60 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
37f70 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
37f80 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
37f90 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
37fa0 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
37fb0 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
37fc0 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
37fd0 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
37fe0 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
37ff0 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
38000 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
38010 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
38020 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
38030 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
38040 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
38050 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
38060 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
38070 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
38080 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
38090 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
380a0 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
380b0 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
380c0 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
380d0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
380e0 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
380f0 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
38100 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
38110 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
38120 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
38130 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
38140 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
38150 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
38160 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
38170 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
38180 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
38190 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
381a0 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
381b0 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
381c0 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
381d0 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
381e0 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
381f0 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
38200 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
38210 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
38220 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
38230 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
38240 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
38250 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
38260 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
38270 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
38280 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
38290 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
382a0 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
382b0 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
382c0 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
382d0 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
382e0 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
382f0 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
38300 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
38310 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
38320 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
38330 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
38340 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
38350 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
38360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
38370 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
38380 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
38390 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
383a0 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
383b0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
383c0 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
383d0 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
383e0 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
383f0 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
38400 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
38410 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
38420 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
38430 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
38440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38450 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68      &<proxy_path
38460 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
38470 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
38480 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
38490 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
384a0 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
384b0 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
384c0 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
384d0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
384e0 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
384f0 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
38500 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
38510 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
38520 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
38530 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
38540 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
38550 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
38560 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
38570 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
38580 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
38590 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
385a0 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
385b0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_D